被说了很多遍的设计模式---备忘录模式

来源:互联网 发布:fl studio12破解版mac 编辑:程序博客网 时间:2024/05/01 21:17

[把你的理性思维慢慢变成条件反射]

好久不见,新年第一更,本文,我们讲介绍备忘录模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:

操作系统:win7 x64

其他软件:eclipse mars,jdk7

-------------------------------------------------------------------------------------------------------------------------------------

经典问题:

系统临时状态保存,数据版本快照等。

思路分析:

要点:状态可保存,可恢复。

示例工程:【用例源于《大话设计模式》】


错误写法:


创建GameRole.java文件,具体内容如下:

public class GameRole {public int vitality;public int attack;public int defense;public int getDefense() {return defense;}public void setDefense(int defense) {this.defense = defense;}public int getAttack() {return attack;}public void setAttack(int attack) {this.attack = attack;}public int getVitality() {return vitality;}public void setVitality(int vitality) {this.vitality = vitality;}public void stateDisplay(){System.out.println("当前状态:");System.out.println("体力:"+this.vitality);System.out.println("攻击力:"+this.attack);System.out.println("防御力:"+this.defense);}public void getInitState(){//此处数据可来自数据库或其他数据源this.vitality = 100;this.attack = 100;this.defense =100;}public void fight(){this.vitality =0;this.attack =0;this.defense =0;}}
创建Window.java文件,具体内容如下:

public class Window {public static void main(String[] args) {GameRole l = new GameRole();l.getInitState();l.stateDisplay();GameRole b = new GameRole();b.setVitality(l.getVitality());b.setAttack(l.getAttack());b.setDefense(l.getDefense());l.fight();l.stateDisplay();l.setVitality(b.getVitality());l.setAttack(b.getAttack());l.setDefense(b.getDefense());l.stateDisplay();}}

错误原因:

备份操作向客户端暴露了过多的细节内容。对以后的对象维护与备份更新产生不利影响。

备忘录模式模板写法:


创建Caretaker.java文件,具体内容如下:

public class Caretaker {private Memento memento;public Memento getMemento() {return memento;}public void setMemento(Memento memento) {this.memento = memento;}}
创建Memento.java文件,具体内容如下:

public class Memento {private String state;public Memento(Originator o){state = o.getState();}public Memento(String state) {this.state = state;}public String getState(){return state;}}

创建Originator.java文件,具体内容如下:

public class Originator {private String state;public Originator() {}public Memento createMemento(){return new Memento(state);}public void setState(String state) {this.state = state;}public String getState() {return state;}public void setMemento(Memento memento){state = memento.getState();}public void show(){System.out.println("state:"+state);}}
创建Window.java文件,具体内容如下:

public class Window {public static void main(String[] args) {//初始状态Originator o = new Originator();o.setState("状态:On");o.show();//改变状态Caretaker c = new Caretaker();c.setMemento(o.createMemento());o.setState("状态:Off");o.show();//状态恢复o.setMemento(c.getMemento());o.show();}}

模式总结:

备忘录模式结构图:


备忘录模式:

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外,保存这个状态。这样以后就可将该对象回复到原先保存的状态。

组成部分:

Originator(发起人):可以根据需要决定Memento存储Originator的那些内部状态。

Memento(备忘录);

Caretaker(管理者):其可以保存一个或者多个备忘录对象,但不能对备忘录对象进行修改操作。

模式扩展:

1.在管理者中可以存在多个备忘录;

2.数据源可以有数据库,文件系统,内存缓存等等。

3.根据备忘录的时间准确恢复到指定版本。

反思:

应用场景:

  1. 对复杂对象中的全部或者部分状态需要进行备份操作,以便日后可以恢复。
  2. 需要对某一个操作执行Undo或Redo操作。
  3. 对历史状态的保存需要实现封装性,避免访问权限泄露。

优点:

  1. 当目前的状态无效或不可用时,可以将系统状态恢复到之前某一个可用的版本。
  2. 对备份操作实现了封装,客户端不用过多关注备份,并且也不担心备份文件被修改。

缺点:

  1. 备份需要占据一定量的时间,空间,某些备份场景可能会导致大量消耗。
  2. 详细备份内容需要精心设计以免出现,数据遗漏,空占资源等等。


-------------------------------------------------------------------------------------------------------------------------------------

至此,被说了很多遍的设计模式---备忘录模式 结束


参考资料:

图书:《大话设计模式》

其他博文:http://blog.csdn.NET/lovelion/article/details/7563445


1 0
原创粉丝点击