十大最好的网站,展厅设计与施工公司,济源做网站,建大网站备忘录模式#xff08;Memento Pattern#xff09;#xff0c;也称为快照模式或Token模式#xff0c;是GoF#xff08;Gang of Four#xff0c;四位设计模式专家#xff09;提出的23种设计模式之一#xff0c;属于行为模式。该模式的主要目的是在不破坏封装性的前提下Memento Pattern也称为快照模式或Token模式是GoFGang of Four四位设计模式专家提出的23种设计模式之一属于行为模式。该模式的主要目的是在不破坏封装性的前提下捕获一个对象的内部状态并在该对象之外保存这个状态以便在适当的时候能够恢复到原先的状态。
备忘录模式主要包含以下三个角色
Originator发起人负责创建一个备忘录Memento用以记录当前时刻自身的内部状态并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。Memento备忘录负责存储Originator对象的内部状态并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口Caretaker只能看到备忘录的窄接口他只能将备忘录传递给其他对象而Originator却可看到备忘录的宽接口允许它访问返回到先前状态所需要的所有数据。Caretaker管理者负责保存备忘录Memento但不能对Memento的内容进行访问或者操作。
备忘录模式的优点包括
封装性备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来从而可以恰当地保持封装的边界。简化发起人发起人不再需要管理和保存其内部状态的一个个版本客户端可以自行管理他们所需要的这些状态的版本。恢复机制提供了一种状态恢复的实现机制使得用户可以方便地回到一个特定的历史步骤当新的状态无效或者存在问题时可以使用暂时存储起来的备忘录将状态复原。
然而备忘录模式也有其缺点
资源消耗如果发起人角色的状态需要完整地存储到备忘录对象中那么在资源消耗上面备忘录对象会很昂贵。存储空间未知当负责人角色将一个备忘录存储起来的时候负责人可能并不知道这个状态会占用多大的存储空间从而无法提醒用户一个操作是否很昂贵。
以下是一个简单的备忘录模式Memento Pattern的Java代码示例。在这个示例中我们有一个Originator类它有一个内部状态并可以创建和恢复其状态的备忘录。Memento类用于存储Originator的状态而Caretaker类则负责保存和管理这些备忘录。
// 备忘录接口
interface Memento {// 这里可以定义一些方法来获取备忘录的状态
}// 具体的备忘录类
class OriginatorMemento implements Memento {private String state;public OriginatorMemento(String state) {this.state state;}// 获取备忘录的状态这里只是一个简单的getter方法public String getState() {return state;}// 可能还有其他方法来设置状态但在这个简单的例子中我们不需要
}// 发起人类
class Originator {private String state;// 创建一个备忘录并返回public Memento createMemento() {return new OriginatorMemento(this.state);}// 恢复备忘录中的状态public void restoreMemento(Memento memento) {this.state ((OriginatorMemento) memento).getState();}// 设置发起人状态public void setState(String state) {this.state state;}// 获取发起人状态public String getState() {return state;}
}// 管理者类
class Caretaker {private Memento memento;// 保存备忘录public void setMemento(Memento memento) {this.memento memento;}// 获取备忘录public Memento getMemento() {return memento;}
}// 客户端代码
public class Client {public static void main(String[] args) {Originator originator new Originator();Caretaker caretaker new Caretaker();// 设置发起人状态originator.setState(State 1);System.out.println(Current state: originator.getState());// 保存当前状态到备忘录caretaker.setMemento(originator.createMemento());// 修改发起人状态originator.setState(State 2);System.out.println(Current state: originator.getState());// 恢复之前保存的备忘录中的状态originator.restoreMemento(caretaker.getMemento());System.out.println(Restored state: originator.getState());}
}在这个例子中Originator类有一个state字段它可以通过setState方法设置并通过getState方法获取。createMemento方法创建一个OriginatorMemento对象其中包含当前的state。restoreMemento方法接受一个Memento对象并将其中的状态设置回Originator的state字段。
Caretaker类用于保存Memento对象并在需要时提供访问。
在Client类中我们创建了一个Originator和一个Caretaker对象并演示了如何设置、保存和恢复Originator的状态。