文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php教程>设计模式之备忘录模式详解(定义、优缺点、应用场景、实例类图)

设计模式之备忘录模式详解(定义、优缺点、应用场景、实例类图)

时间:2024-12-09  来源:互联网  标签: PHP教程

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象,备忘录模式属于行为型模式。备忘录模式允许在不破坏封装性的前提下,捕获和恢复对象的内部状态。

一、备忘录模式的介绍

意图

在不破坏封装性的前提下,捕获一个对象的内部状态,并允许在对象之外保存和恢复这些状态。

主要解决的问题

允许捕获并保存一个对象的内部状态,以便在将来可以恢复到该状态,实现撤销和回滚操作。

使用场景

当需要提供一种撤销机制,允许用户回退到之前的状态时。

实现方式

  • 创建备忘录类:用于存储和封装对象的状态。

  • 创建发起人角色:负责创建备忘录,并根据需要恢复状态。

  • 创建备忘录管理类(可选):负责管理所有备忘录对象。

  • 关键代码

  • 备忘录:存储发起人的状态信息。

  • 发起人:创建备忘录,并根据备忘录恢复状态。

  • 结构

    备忘录模式包含以下几个主要角色:

  • 备忘录(Memento):负责存储原发器对象的内部状态。备忘录可以保持原发器的状态的一部分或全部信息。

  • 原发器(Originator):创建一个备忘录对象,并且可以使用备忘录对象恢复自身的内部状态。原发器通常会在需要保存状态的时候创建备忘录对象,并在需要恢复状态的时候使用备忘录对象。

  • 负责人(Caretaker):负责保存备忘录对象,但是不对备忘录对象进行操作或检查。负责人只能将备忘录传递给其他对象。

  • 应用实例

  • 后悔药:提供一种撤销操作的功能。

  • 游戏存档:保存游戏进度,允许玩家加载之前的存档。

  • Windows中的Ctrl+Z:实现撤销操作。

  • IE浏览器的后退:允许用户回退到之前的页面。

  • 数据库事

  • 务管理:通过事务日志保存状态,实现回滚。

  • 二、备忘录模式的优缺点

    优点

  • 提供状态恢复机制:允许用户方便地回到历史状态。

  • 封装状态信息:用户不需要关心状态的保存细节。

  • 缺点

  • 资源消耗:如果对象的状态复杂,保存状态可能会占用较多资源。

  • 三、备忘录模式的使用建议

  • 在需要保存和恢复数据状态的场景中使用备忘录模式。

  • 考虑使用原型模式结合备忘录模式,以节约内存。

  • 为了降低耦合度,应通过备忘录管理类间接管理备忘录对象。

  • 备忘录模式应谨慎使用,避免过度消耗系统资源。

  • 四、备忘录模式的实现

    备忘录模式使用三个类 Memento、Originator 和 CareTaker。Memento 包含了要被恢复的对象的状态。Originator 创建并在 Memento 对象中存储状态。Caretaker 对象负责从 Memento 中恢复对象的状态。

    MementoPatternDemo,我们的演示类使用 CareTaker 和 Originator 对象来显示对象的状态恢复。

    备忘录模式

  • 步骤 1:创建 Memento 类。

  • Memento.java

    publicclassMemento{
    privateStringstate;
    
    publicMemento(Stringstate){
    this.state=state;
    }
    
    publicStringgetState(){
    returnstate;
    }
    }
  • 步骤 2:创建 Originator 类。

  • Originator.java

    publicclassOriginator{
    privateStringstate;
    
    publicvoidsetState(Stringstate){
    this.state=state;
    }
    
    publicStringgetState(){
    returnstate;
    }
    
    publicMementosaveStateToMemento(){
    returnnewMemento(state);
    }
    
    publicvoidgetStateFromMemento(MementoMemento){
    state=Memento.getState();
    }
    }
  • 步骤 3:创建 CareTaker 类。

  • CareTaker.java

    importjava.util.ArrayList;
    importjava.util.List;
    
    publicclassCareTaker{
    privateList<Memento>mementoList=newArrayList<Memento>();
    
    publicvoidadd(Mementostate){
    mementoList.add(state);
    }
    
    publicMementoget(intindex){
    returnmementoList.get(index);
    }
    }
  • 步骤 4:使用 CareTaker 和 Originator 对象。

  • MementoPatternDemo.java

    publicclassMementoPatternDemo{
    publicstaticvoidmain(String[]args){
    Originatororiginator=newOriginator();
    CareTakercareTaker=newCareTaker();
    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("CurrentState:"+originator.getState());
    originator.getStateFromMemento(careTaker.get(0));
    System.out.println("FirstsavedState:"+originator.getState());
    originator.getStateFromMemento(careTaker.get(1));
    System.out.println("SecondsavedState:"+originator.getState());
    }
    }
  • 步骤 5:验证输出。

  • CurrentState:State#4
    FirstsavedState:State#2
    SecondsavedState:State#3

    以上就是php小编整理的全部内容,希望对您有所帮助,更多相关资料请查看php教程栏目。

    相关阅读更多 +
    最近更新
    排行榜 更多 +
    元梦之星最新版手游

    元梦之星最新版手游

    棋牌卡牌 下载
    我自为道安卓版

    我自为道安卓版

    角色扮演 下载
    一剑斩仙

    一剑斩仙

    角色扮演 下载