当前位置: 首页 > wzjs >正文

安徽集团网站建设windows优化大师有哪些功能

安徽集团网站建设,windows优化大师有哪些功能,聊城wap网站建设,做商务网站服务文章目录 前言一、备忘录模式二、备忘录模式示例1三、备忘录模式示例2 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a…

文章目录

  • 前言
  • 一、备忘录模式
  • 二、备忘录模式示例1
  • 三、备忘录模式示例2


前言

GOF设计模式分三大类:

  • 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。
  • 结构型模式:关注类和对象之间的组合,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。
  • 行为型模式:关注对象之间的交互,包括职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。

一、备忘录模式

备忘录模式(Memento Pattern)

  • 定义:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。

  • 解决问题:如何在软件中实现撤销功能?

  • 使用场景:

    • 保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时就能够恢复到先前的状态,实现撤销操作。
    • 防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。
  • 组成:

    • Originator(原发器):它是一个普通类,可以创建一个备忘录,并存储其当前内部状态,也可以使用备忘录来恢复其内部状态。一般将需要保存内部状态的类设计为原发器。
    • Memento(备忘录):存储原发器的内部状态,根据原发器来决定保存哪些内部状态。备忘录的设计一般可以参考原发器的设计,根据实际需要确定备忘录类中的属性。需要注意的是,除了原发器本身与负责人类之外,备忘录对象不能直接供其他类使用。
    • Caretaker(负责人):负责人又称为管理者,他负责保存备忘录,但是不能对备忘录的内容进行操作或检查。在负责人类中可以存储一个或多个备忘录对象,他只负责存储对象,而不能修改对象,也无须知道对象的实现细节。
  • 补充说明:

    • 撤销功能的实现原理:在实现撤销时,首先必须保存软件系统的历史状态。当用户需要取消错误操作并且返回到某个历史状态时,可以取出事先保存的历史状态来覆盖当前状态。
    • 通过使用备忘录模式可以使系统恢复到某一特定的历史状态。当前很多软件都提供了撤销(Undo)操作,其中就使用了备忘录模式。
    • 备忘录模式的核心是备忘录类以及用于管理备忘录的负责人类的设计。
      • 在真实业务中,原发器类是一个具体的业务类,它包含一些用于存储成员数据的属性。
      • 对于备忘录类Memento而言,它通常提供了与原发器相对应的属性(可以是全部,也可以是部分)用于存储原发器的状态。
      • 对于负责人类Caretaker,它用于保存备忘录对象,并提供getMemento()方法用于向客户端返回一个备忘录对象。
  • 优点:

    • 它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤。
    • 备忘录实现了对信息的封装。
  • 缺点:

    • 资源消耗过大

在这里插入图片描述

二、备忘录模式示例1

使用备忘录模式来设计中国象棋软件,提供“悔棋”功能

  • Chessman充当原发器,ChessmanMemento充当备忘录,MementoCaretaker充当负责人
  • 在MementoCaretaker中定义了一个ChessmanMemento类型的对象,用于存储备忘录。
### 备忘录模式
"""原发器:象棋棋子"""class Chessman:def __init__(self, label: str, x: int, y: int):self.label = labelself.x = xself.y = ydef save(self) -> "ChessmanMemento":# 保存状态return ChessmanMemento(self.label, self.x, self.y)def restore(self, memento: "ChessmanMemento"):# 恢复状态self.label = memento.labelself.x = memento.xself.y = memento.y"""备忘录:象棋棋子备忘录"""class ChessmanMemento:def __init__(self, label: str, x: int, y: int):self.label = labelself.x = xself.y = y"""负责人:象棋棋子备忘录管理"""class MementoCaretaker:def __init__(self):self.memento: ChessmanMemento = Nonedef get_memento(self):return self.mementodef set_memento(self, memento: ChessmanMemento):self.memento = memento
  • 客户端代码
def display(chess: Chessman):print(f"棋子 {chess.label} 当前位置为:行 {chess.x}{chess.y}")if __name__ == "__main__":mc = MementoCaretaker()chess = Chessman("车", 2, 2)display(chess)mc.set_memento(chess.save())  # 保存状态chess.y = 4display(chess)mc.set_memento(chess.save())  # 保存状态chess.x = 5display(chess)print("###悔棋###")chess.restore(mc.get_memento())  # 恢复状态display(chess)
  • 输出结果
棋子 车 当前位置为:行 22
棋子 车 当前位置为:行 24
棋子 车 当前位置为:行 54
###悔棋###
棋子 车 当前位置为:行 24

三、备忘录模式示例2

实现多次撤销

  • 在负责人类中定义列表来存储多个备忘录。修改负责人代码:
"""负责人:象棋棋子备忘录管理"""
class MementoCaretaker:def __init__(self):self.memento_list_f: list[ChessmanMemento] = []  # 前进状态self.memento_list_b: list[ChessmanMemento] = []  # 悔棋状态def get_memento_f(self):# 用于悔棋self.memento_list_b.append(self.memento_list_f.pop())return self.memento_list_f[-1]def get_memento_b(self):# 用于撤销悔棋memento = self.memento_list_b.pop()self.memento_list_f.append(memento)return mementodef set_memento(self, memento: ChessmanMemento):# 下棋保存状态self.memento_list_b.clear()  # 棋子前进,则清空悔棋状态self.memento_list_f.append(memento)
  • 客户端代码
def display(chess: Chessman):print(f"棋子 {chess.label} 当前位置为:行 {chess.x}{chess.y}")def play(chess: Chessman, mc: MementoCaretaker):# 下棋mc.set_memento(chess.save())  # 保存备忘录display(chess)def undo(chess: Chessman, mc: MementoCaretaker):# 悔棋print("###悔棋###")chess.restore(mc.get_memento_f())display(chess)def redo(chess: Chessman, mc: MementoCaretaker):# 撤销悔棋print("###撤销悔棋###")chess.restore(mc.get_memento_b())display(chess)if __name__ == "__main__":mc = MementoCaretaker()chess = Chessman("车", 1, 1)play(chess, mc)chess.y = 4play(chess, mc)chess.x = 5play(chess, mc)undo(chess, mc)undo(chess, mc)redo(chess, mc)redo(chess, mc)
  • 输出结果
棋子 车 当前位置为:行 11
棋子 车 当前位置为:行 14
棋子 车 当前位置为:行 54
###悔棋###
棋子 车 当前位置为:行 14
###悔棋###
棋子 车 当前位置为:行 11
###撤销悔棋###
棋子 车 当前位置为:行 14
###撤销悔棋###
棋子 车 当前位置为:行 54

您正在阅读的是《设计模式Python版》专栏!关注不迷路~

http://www.dtcms.com/wzjs/47989.html

相关文章:

  • 有没有做兼职的网站吗保定百度首页优化
  • 当今做网站的流行趋势邯郸网站优化
  • 企业网站托管电话百度指数行业排行
  • 装饰公司排名百度seo有用吗
  • 官网优化哪家专业重庆seo整站优化
  • 新商盟网站开发时间国际军事新闻最新消息今天
  • 做ppt音乐模板下载网站网站推广的100种方法
  • 永川做网站的百度seo点击排名优化
  • 在自己电脑上建网站交换友链平台
  • 做政府网站公司手机网站怎么优化
  • 华为手机网站建设策划书营销网站类型
  • 有哪些网站有收录做红酒的商行百度seo教程视频
  • 如何做求职招聘网站襄阳网站推广优化技巧
  • 办公网站模板人民网疫情最新消息
  • 苏州网站关键词优化推广一个产品的宣传和推广方案
  • 营销网站制作哪家靠谱seo课培训
  • 上海松一网站建设怎么把产品快速宣传并推广
  • 买域名的网站湘潭seo培训
  • 汽车配件响应式网站网络营销的应用研究论文
  • 甘肃省级建设主管部门网站品牌营销经典案例
  • 杭州专业的网站制作公司搜索引擎排名原理
  • 外贸新手怎样用谷歌找客户域名年龄对seo的影响
  • 厦门电商网站百度官方网站登录
  • 淄赌博做网站创量广告投放平台
  • 宁波专业做网站的公司有哪些aso关键词排名优化是什么
  • 浙江省水利建设行业协会网站app推广拉新平台
  • 湖南的商城网站建设关键词全网搜索工具
  • 东莞seo建站优化收费百度推广多少钱
  • 做的网站百度上可以搜到吗seo技术经理
  • 移动网站开发pdf自主建站