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()
在这个例子中,ConcreteCommand
是Command
的一个具体实现,它实现了execute
方法。Receiver
是执行操作的对象,它的action
方法就是要执行的操作。Invoker
对象存储了命令对象,并可以在任何时候调用它们的execute
方法来执行这些命令。
Command模式的一个常见用例是实现撤销/重做操作。在这种情况下,每个命令对象都需要实现一个undo
方法,这个方法能够撤销execute
方法的效果。Invoker
对象可以保留一个已执行命令的历史记录,这样就可以在任何时候撤销或重做任何命令。