首页 > 其他 > 详细

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

时间:2017-02-10 10:45:23      阅读:205      评论:0      收藏:0      [点我收藏+]

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

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

操作系统: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


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

原文:http://blog.csdn.net/abcd898989/article/details/54880306

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!