设计模式:备忘录设计模式

电子说

1.3w人已加入

描述

模式描述

备忘录设计模式(Memento Design Pattern)是一种行为型设计模式,它的主要目的是在不破坏对象封装性的前提下,捕捉和保存一个对象的内部状态,以便稍后可以将对象恢复到该状态。这种模式通常用于实现撤销和重做操作。

主要角色

1、备忘录(Memorandum) :保存了发起人的状态,从而能够在适当的时候恢复状态。2. 发起人(Originator) :创建一个备忘录,以表示其当前状态,并可以从备忘录中恢复状态。

引用场景

1.后退/前进:浏览器的后退/前进就是缓存页面状态的典型例子。2.撤销/重做:通常基于备忘录模式实现撤销和重做操作。3.快照:保存某个时间点对象的状态快照。

设计要点

1.仅仅存储状态:备忘录仅存储对象的内部状态,而不是存储对象的引用。2.完全封装:外部不会访问到备忘录类。3.避免权限问题:发起人应该具有创建和访问备忘录的权限。

优缺点

•轻松实现对象状态的快照和恢复•分离了对象与状态的保存与恢复过程•需要额外的空间来存储状态

与备忘录模式类似的模式

•原型模式:对一个对象进行克隆,产生一个与原对象类似的新对象。

Java代码示例

首先,我们创建一个发起人(Originator)类,它具有保存和恢复状态的能力:

publicclassOriginator{
privateString state;


publicvoid setState(String state){
this.state = state;
}


publicString getState(){
return state;
}


publicMemento saveStateToMemento(){
returnnewMemento(state);
}


publicvoid getStateFromMemento(Memento memento){
        state = memento.getState();
}
}

接下来,我们创建备忘录(Memento)类,用于保存发起人的状态:

publicclassMemento{
privateString state;


publicMemento(String state){
this.state = state;
}


publicString getState(){
return state;
}
}

现在,我们创建一个负责人(Caretaker)类,用于管理备忘录:

import java.util.ArrayList;
import java.util.List;


publicclassCaretaker{
privateList< Memento > mementoList =newArrayList<  >();


publicvoid add(Memento state){
        mementoList.add(state);
}


publicMementoget(int index){
return mementoList.get(index);
}
}

最后,我们在主类中使用这些类:

publicclassMementoPatternDemo{
publicstaticvoid main(String[] args){
Originator originator =newOriginator();
Caretaker caretaker =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("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());
}
}

扩展知识点

备忘录模式与命令模式(Command Pattern)可以结合使用,以实现更加强大的撤销/重做功能。命令模式可以用来记录操作的顺序和执行操作,而备忘录模式用来记录操作前后的状态。这样一来,我们可以轻松地在操作序列中向前或向后移动,同时还可以保留每个操作的上下文信息。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分