备忘录模式(Memento Pattern)是一种行为设计模式,允许在不破坏封装的情况下捕获和恢复对象的内部状态。它主要用于实现撤销操作。
在软件开发中,有时需要记录对象的内部状态,以便在需要时恢复到某个先前的状态。例如,文本编辑器的撤销功能就是一个典型的应用场景。备忘录模式通过将对象的状态保存在备忘录对象中,从而实现状态的保存和恢复。
一,备忘录模式的结构
备忘录模式涉及三个主要角色:
- Originator(发起人):创建一个包含其当前内部状态的备忘录,并使用备忘录恢复其内部状态。
- Memento(备忘录):存储发起人的内部状态,并防止其他对象访问备忘录。备忘录有两个接口:一个是提供给发起人以外的对象的窄接口,另一个是仅提供给发起人的宽接口。
- Caretaker(管理者):负责保存备忘录,但不能对备忘录的内容进行操作或检查。
uml类图:
二,备忘录模式的实现
以下是一个简单的备忘录模式实现示例:
// Memento class
public class Memento {private String state;public Memento(String state) {this.state = state;}public String getState() {return state;}
}// Originator class
public class Originator {private String state;public void setState(String state) {this.state = state;}public String getState() {return state;}public Memento saveStateToMemento() {return new Memento(state);}public void getStateFromMemento(Memento memento) {state = memento.getState();}
}// Caretaker class
import java.util.ArrayList;
import java.util.List;public class Caretaker {private List<Memento> mementoList = new ArrayList<>();public void add(Memento state) {mementoList.add(state);}public Memento get(int index) {return mementoList.get(index);}
}// Demo class
public class MementoPatternDemo {public static void main(String[] args) {Originator originator = new Originator();Caretaker caretaker = new Caretaker();originator.setState("State #1");originator.setState("State #2");caretaker.add(originator.saveStateToMemento());originator.setState("State #3");caretaker.add(originator.saveStateToMemento());originator.setState("State #4");System.out.println("Current State: " + originator.getState());originator.getStateFromMemento(caretaker.get(0));System.out.println("First saved State: " + originator.getState());originator.getStateFromMemento(caretaker.get(1));System.out.println("Second saved State: " + originator.getState());}
}
三,备忘录模式的优缺点
优点
- 封装性好: 备忘录模式保存和恢复对象的状态时,不需要暴露对象的内部细节。
- 简化撤销操作: 可以很容易地实现对象状态的保存和恢复,简化了撤销操作的实现。
缺点
- 资源消耗大: 如果需要频繁保存和恢复对象的状态,可能会占用大量的内存资源。
- 实现复杂: 对于复杂对象的状态保存和恢复,可能需要额外的工作来管理备忘录。
四,备忘录模式的适用场景
需要保存和恢复对象的状态时。
需要实现撤销操作时。
需要避免暴露对象的内部状态和实现细节时。
五,总结
备忘录模式通过将对象的状态保存在备忘录对象中,从而实现状态的保存和恢复。它在不破坏封装的前提下,提供了一种简洁的方式来实现撤销操作,但也需要注意资源消耗和实现复杂度的问题。
如果你对设计模式、软件架构、编程技巧等内容感兴趣,欢迎关注我们的同名微信公众号【技术拾光者】。在这里,我们将定期分享最新的技术文章和实用的编程技巧,帮助你不断提升自己的技术水平。
扫描下方二维码,立即关注我们吧!
感谢你的阅读和支持,我们期待与你在微信公众号上交流更多有趣的技术话题!