行为型设计模式 - 备忘录模式详解
备忘录模式(Memento Pattern):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态
2|0模式结构Originator(发起者):记录当前的状态,负责创建和恢复备忘录
Memento(备忘录):负责存储发起者的状态,在需要的时候提供发起人需要的状态
Caretaker(管理者):管理备忘录
3|0代码演示(这里我们以单角色、单状态、单备份来演示,思想是相同的,无非是存储数据结构上的区别)
备忘录角色,定义了存储状态的变量,可以根据实际需求定义对应的存储对象
publicclassMemento{privateStringstate;publicStringgetState(){returnstate;}publicvoidsetState(Stringstate){this.state=state;}}
发起者角色,存储状态,并且可以创建备忘录和将状态恢复为备忘录的值
publicclassOriginator{privateStringstate;publicStringgetState(){returnstate;}publicvoidsetState(Stringstate){this.state=state;}publicMementocreateMemento(){Mementomemento=newMemento();memento.setState(state);returnmemento;}publicvoidrestoreMemento(Mementomemento){this.state=memento.getState();}}
管理者角色,管理了备忘录
publicclassCaretaker{privateMementomemento;publicMementogetMemento(){returnmemento;}publicvoidsetMemento(Mementomemento){this.memento=memento;}}
测试类
publicclassClient{@Testpublicvoidtest(){//设置初始状态Originatororiginator=newOriginator();originator.setState("状态1");System.out.println("初始状态:"+originator.getState());//创建管理者Caretakercaretaker=newCaretaker();caretaker.setMemento(originator.createMemento());//更新状态originator.setState("状态2");System.out.println("跟新状态:"+originator.getState());//恢复状态originator.restoreMemento(caretaker.getMemento());System.out.println("恢复状态:"+originator.getState());}}
运行结果
初始状态:状态1跟新状态:状态2恢复状态:状态1
4|0模式分析优点:
给用户提供了一种可以恢复状态的机制,使用户可以比较方便的回退到某个历史的状态实现了信息的封装,使用户不需要关心备忘录中状态的保存细节缺点:
在实际应用中,备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是比较严重的,为了节约内存,可以配合原型模式使用应用场景:
游戏的存档CTRL + Z 撤销浏览器的后退数据库的事务管理... ...声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。