23种设计模式之备忘录模式

打印 上一主题 下一主题

主题 826|帖子 826|积分 2480

1. 简介

备忘录模式(Memento Pattern) 是一种举动设计模式,它答应在不粉碎封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后可以将对象恢复到之前保存的状态。
比方,在文本编辑器软件中,用户大概会进行一系列的编辑操作,如输入笔墨、删除段落等。备忘录模式可以用来保存文本编辑器在各个操作阶段的状态,当用户想要撤销操作时,就可以利用保存的备忘录将文本恢复到之前的某个状态。
结构:


  • 原发器(Originator)类
    原发器是需要保存状态的对象,它创建备忘录对象并将自身状态存储在备忘录中,也可以从备忘录中恢复状态。
  • 备忘录(Memento)类
    备忘任命于存储原发器的状态。它是一个内部状态的存储载体,除了原发器自己外,其他对象不能直接访问备忘录的内部状态。
  • 负责人(Caretaker)类
    负责人负责保存备忘录对象,但不能对备忘录的内容进行修改或访问。它重要的职责是管理备忘录,如存储和提供备忘录给原发器进行状态恢复。
2. 代码

2.1 Order (原发器类)

  1. public class Order {
  2.     private String state;
  3.     public String getState() {
  4.         return state;
  5.     }
  6.     public Order(String state){
  7.         this.state = state;
  8.     }
  9. }
复制代码
2.2 Memento (备忘录类)

  1. public class Memento {
  2.     private String state;
  3.     public String getState() {
  4.         return state;
  5.     }
  6.     public void setState(String state) {
  7.         this.state = state;
  8.     }
  9.     public Order saveStateToOrder(){
  10.         return new Order(state);
  11.     }
  12.     public void getStateFromOrder(Order order){
  13.         state = order.getState();
  14.     }
  15. }
复制代码
2.3 Container (负责人类)

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class Container {
  4.      private List<Order> orderList = new ArrayList<>();
  5.      public void addOrder(Order order){
  6.          orderList.add(order);
  7.      }
  8.      public Order getOrder(int index){
  9.          return orderList.get(index);
  10.      }
  11. }
复制代码
2.4 Test (测试)

  1. public class Test {
  2.     public static void main(String[] args) {
  3.         Memento memento = new Memento();
  4.         Container container = new Container();
  5.         memento.setState("#1. 做饭");
  6.         container.addOrder(memento.saveStateToOrder());
  7.         memento.setState("#2. 炒菜");
  8.         container.addOrder(memento.saveStateToOrder());
  9.         memento.setState("#3. 吃饭");
  10.         container.addOrder(memento.saveStateToOrder());
  11.         System.out.println(memento.getState());
  12.         memento.getStateFromOrder(container.getOrder(0));
  13.         System.out.println("备忘录:" + memento.getState());
  14.         memento.getStateFromOrder(container.getOrder(1));
  15.         System.out.println("备忘录:" + memento.getState());
  16.         memento.getStateFromOrder(container.getOrder(2));
  17.         System.out.println("备忘录:" + memento.getState());
  18.     }
  19. }
复制代码
2.5 运行结果

  1. #3. 吃饭
  2. 备忘录:#1. 做饭
  3. 备忘录:#2. 炒菜
  4. 备忘录:#3. 吃饭
复制代码
3. 使用场景



  • 撤销和重做功能:在文本编辑器中,如Word或记事本,用户可以使用Ctrl+Z组合键来撤销近来的操作,而Ctrl+Y组合键则用于重做。这种场景非常适合使用备忘录模式,因为它答应用户在不粉碎封装性的环境下回滚到之前的状态。
  • 游戏存档:在游戏开辟中,备忘录模式可以用于保存玩家的游戏进度,使得玩家可以在任何时候从之前的状态继承游戏。这不仅进步了游戏的可玩性,还增强了玩家的游戏体验。
  • 数据库事务管理:在数据库操作中,备忘录模式可以用于事务管理,确保在执行一系列操作之前能够恢复到事务开始前的状态。这对于包管数据的一致性和完备性非常有用。
  • 日记纪录和错误恢复:在软件开辟中,备忘录模式可以用于日记纪录和错误恢复。通过保存程序执行过程中的状态快照,可以在出现问题时快速恢复到之前的状态,从而淘汰调试时间和成本。
  • 持久化状态:有时需要将对象的状态保存到磁盘或数据库中,以便在以后的时间点恢复。备忘录模式可以方便地将对象的状态序列化并保存,从而实现持久化。
  • 欣赏器回退功能:欣赏器通常提供回退功能,答应用户通过点击历史纪录按钮返回到之前的页面。这种场景也可以使用备忘录模式来实现,通过保存页面加载的历史状态。
需要留意的是,虽然备忘录模式提供了灵活的状态恢复机制,但也存在一些埋伏的问题。比方,它大概会导致资源斲丧增加,特殊是在需要保存大量状态的环境下。因此,在实际应用中需要权衡其利弊,并根据具体需求进行恰当的调解和优化
4. 优缺点



  • 备忘录模式的优点

    • 状态保存和恢复功能方便
      可以方便地保存对象的状态,而且在需要的时候准确地恢复对象的状态。这在实现撤销 / 重做功能等场景下非常有用。就像在图形编辑软件中,用户可以利用备忘录模式轻松地撤销之前的画图操作,恢复到之前的图外形态。
    • 保持封装性
      原发器的状态被保存在备忘录中,备忘录的内部结构对其他对象是隐藏的。如许可以确保原发器状态的完备性和安全性,防止外部对象对其状态进行不恰当的访问和修改。比方,在一个复杂的游戏脚色状态保存场景中,游戏脚色(原发器)的状态细节(如品级、装备等)被安全地封装在备忘录中,只有通过脚色自己的恢复方法才气精确地使用这些状态信息。

  • 备忘录模式的缺点

    • 资源斲丧
      假如需要频繁地保存对象的状态,大概会斲丧大量的内存空间来存储备忘录。比方,在一个实时视频编辑软件中,假如对每一帧画面的状态都使用备忘录模式进行保存,将会占用巨大的内存资源。
    • 复杂的状态管理
      当原发器的状态比力复杂,涉及多个数据成员和复杂的对象关系时,备忘录的管理和状态恢复大概会变得比力复杂。比方,在一个企业资源规划(ERP)系统中,一个业务流程对象(原发器)的状态大概涉及多个子模块的状态信息,使用备忘录模式来保存和恢复状态就需要细致地处理这些复杂的状态关系。

5. 总结

这里的例子与网上的不一样,这里可以实现多个回退

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表