介绍memento模式和command模式

news/2025/1/16 2:03:34/

memento

Memento模式是一种行为设计模式,它提供了保存和恢复对象之前状态的能力。这通常用于实现"撤销"操作。Memento模式涉及三个主要组件:原发器(Originator)、备忘录(Memento)和看护人(Caretaker)。

  • 原发器(Originator)是我们希望保存状态的那个对象。
  • 备忘录(Memento)是一个简单的数据结构,它存储原发器的内部状态。备忘录没有任何操作,只用作存储数据。
  • 看护人(Caretaker)是负责保存和恢复备忘录的对象。看护人通过原发器的接口来获取和恢复其状态,但不会直接访问备忘录的内部结构。

以下是一个Python实现的例子:

class Memento:def __init__(self, state):self._state = statedef get_state(self):return self._stateclass Originator:_state = ""def set(self, state):print("Originator: Setting state to", state)self._state = statedef save_to_memento(self):print("Originator: Saving to Memento.")return Memento(self._state)def restore_from_memento(self, memento):self._state = memento.get_state()print("Originator: State after restoring from Memento:", self._state)class Caretaker:def __init__(self):self._savings = []def add_memento(self, memento):self._savings.append(memento)def get_memento(self, index):return self._savings[index]if __name__ == "__main__":caretaker = Caretaker()originator = Originator()originator.set("State1")originator.set("State2")caretaker.add_memento(originator.save_to_memento())originator.set("State3")caretaker.add_memento(originator.save_to_memento())originator.set("State4")originator.restore_from_memento(caretaker.get_memento(1))

在上述代码中,Originator对象的状态通过set方法更改,并通过save_to_memento方法保存到一个Memento对象中。Caretaker对象维护了一个Memento对象的列表,可以使用add_memento方法添加新的Memento对象,并使用get_memento方法获取旧的Memento对象。最后,可以使用Originator对象的restore_from_memento方法恢复其之前的状态。

command

Command模式是一种行为设计模式,让你能够将操作(撤销/重做、操作/事务等)封装成独立的对象,这些对象包含原始信息:调用的方法,方法的参数等。

这种模式的主要优点是它解耦了请求者(Invoker)和接收者(Receiver)之间的关系。请求者不需要知道接收者的任何接口,只需要知道如何发送请求。接收者可以在任何时候处理这些请求,而无需知道请求者的任何信息。

在Python中,Command模式可以使用简单的类和方法来实现。以下是一个例子:

class Command:"""The Command interface declares a method for executing a command."""def __init__(self, receiver):self._receiver = receiverdef execute(self):passclass ConcreteCommand(Command):"""Some commands can implement simple operations on their own."""def execute(self):self._receiver.action()class Receiver:"""The Receiver classes contain some important business logic."""def action(self):print("Receiver: Working on request.")class Invoker:"""The Invoker is associated with one or several commands."""def __init__(self):self._commands = []def store_command(self, command):self._commands.append(command)def execute_commands(self):for command in self._commands:command.execute()if __name__ == "__main__":receiver = Receiver()concrete_command = ConcreteCommand(receiver)invoker = Invoker()invoker.store_command(concrete_command)invoker.execute_commands()

在这个例子中,ConcreteCommandCommand的一个具体实现,它实现了execute方法。Receiver是执行操作的对象,它的action方法就是要执行的操作。Invoker对象存储了命令对象,并可以在任何时候调用它们的execute方法来执行这些命令。

Command模式的一个常见用例是实现撤销/重做操作。在这种情况下,每个命令对象都需要实现一个undo方法,这个方法能够撤销execute方法的效果。Invoker对象可以保留一个已执行命令的历史记录,这样就可以在任何时候撤销或重做任何命令。


http://www.ppmy.cn/news/69166.html

相关文章

空间权重矩阵与相关性检验(Stata)

空间权重矩阵与相关性检验(Stata) 文章目录 空间权重矩阵与相关性检验(Stata)[toc]1 空间相关性检验1.1 全局空间相关性检验1.2 局部空间自相关检验1.3 散点图 2 权重矩阵2.1 截断距离权重矩阵2.2 反距离权重矩阵 1 空间相关性检验 cd "D:\Allcode\Stata\Spatial-Econome…

ChatGPT使用方法

当使用ChatGPT时,可以按照以下步骤进行操作。本博客将详细介绍每个步骤以及相应的代码示例。 步骤 1:设置环境 确保你的开发环境满足以下要求: 使用Python 3.x。安装OpenAI的Python库:openai。 步骤 2:获取API密钥…

【计组】海明码

文章目录 一、海明码二、检验位的计算公式 2 k 2^{k} 2k n k 1;1.校验规则2.配偶原则3.配奇原则 总结 一、海明码 海明码就是加在原二进制代码中的一些01序列,这些序列只能存在于2的整数次方的位上。 二、检验位的计算公式 2 k 2^{k} 2k n k 1; 1.校验规则…

keycloak源码打镜像

keycloak源码打镜像; 1,进入源码根目录,执行: mvn clean install -Pdistribution -Dmaven.test.skiptrue -Denforcer.skiptrue -Dmaven.javadoc.skiptrue -DskipTests -T 4打包 PS:打包提示有tets报错, 1…

XShell远程连接

xshell 是一个强大的安全终端模拟软件,它支持SSH1,SSH2以及microsoft windows 平台的TELNET协议。xshell通过互联网到远程主机的安全连接。 xshell可以在windows界面下来访问远程终端不同系统下的服务器,从而比较好的达到远程控制终端的目的。 步骤一 …

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我一直强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而且实际向安全过渡后可用到的关键…

flink watermark介绍及watermark的窗口触发机制

Flink的三种时间 在谈watermark之前,首先需要了解flink的三种时间概念。在flink中,有三种时间戳概念:Event Time 、Processing Time 和 Ingestion Time。其中watermark只对Event Time类型的时间戳有用。这三种时间概念分别表示: …

DeserializationFeature配置

序言 com.fasterxml.jackson.databind包中有很多属性 1)映射特性:MapperFeature;2)序列化特性:SerializationFeature;3)反序列化特性:DeserializationFeature; 最近开…