设计模式之备忘录模式

1,为什么要使用备忘录设计模式

当我们需要去保存一个对象的运行状态的时候我们就需要使用备忘录设计模式.假设我们有这样一个需求,有一台dvd机器能够保存之前播放的dvd时间,音量还有亮度.这个操作直接写成代码:

DVD机器:

public class DvdMachine {
	private DvdDisc dvdDisc = null;
	public void setDvdDisc(DvdDisc dvdDisc){
		this.dvdDisc = dvdDisc;
	}
	public void startPlay(){
		if(dvdDisc == null){
			System.out.println("你的DVD是空的");
		}
		dvdDisc.setLuminance(60);
		dvdDisc.setTime(0);
		dvdDisc.setVolume(80);
	}
	public void stopPlay(){
		if(dvdDisc == null){
			System.out.println("你的DVD是空的");
		}
		dvdDisc.setLuminance(70);
		dvdDisc.setTime(80);
		dvdDisc.setVolume(60);
	}
}
DVDisc:

public class DvdDisc{
	public int time;
	public int volume;
	public int luminance;
	public int getTime() {
		return time;
	}

	public int getVolume() {
		return volume;
	}

	public void setVolume(int volume) {
		this.volume = volume;
	}

	public int getLuminance() {
		return luminance;
	}

	public void setLuminance(int luminance) {
		this.luminance = luminance;
	}

	public void setTime(int time) {
		this.time = time;
	}
}
Main:

public class Main {

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		//第一次播放
		DvdMachine dvdMachine = new DvdMachine();
		DvdDisc dvdDisc = new DvdDisc();
		dvdMachine.setDvdDisc(dvdDisc);
		dvdMachine.startPlay();
		dvdMachine.stopPlay();
		//备份
		int time = dvdDisc.getTime();
		int volume = dvdDisc.getVolume();
		int luminance = dvdDisc.getLuminance();
		//第二次播放赋予备份数据
		dvdDisc.setTime(time);
		dvdDisc.setVolume(volume);
		dvdDisc.setLuminance(luminance);
	}

}

代码无错未必优,这样的备份过程暴露了细节,使客户端的职责过多,我们希望把保存的细节给封装起来,这个时候就要用到备忘录模式.

2,什么是备忘录设计模式

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


3,怎么使用备忘录设计模式

按照备忘录模式设计后

UML


代码部分:

DvdDisc.class

public class DvdDisc{
	public int time;
	public int volume;
	public int luminance;
	public int getTime() {
		return time;
	}

	public int getVolume() {
		return volume;
	}

	public void setVolume(int volume) {
		this.volume = volume;
	}

	public int getLuminance() {
		return luminance;
	}

	public void setLuminance(int luminance) {
		this.luminance = luminance;
	}

	public void setTime(int time) {
		this.time = time;
	}
}

DvdMachine.class

public class DvdMachine {
	private DvdDisc dvdDisc = null;
	public void setDvdDisc(DvdDisc dvdDisc){
		this.dvdDisc = dvdDisc;
	}
	public void startPlay(){
		if(dvdDisc == null){
			System.out.println("你的DVD是空的");
		}
		dvdDisc.setLuminance(60);
		dvdDisc.setTime(0);
		dvdDisc.setVolume(80);
	}
	public void stopPlay(){
		if(dvdDisc == null){
			System.out.println("你的DVD是空的");
		}
		dvdDisc.setLuminance(70);
		dvdDisc.setTime(80);
		dvdDisc.setVolume(60);
	}
}

DvdStateManager.class

public class DvdStateManager {
	private DvdState dvdState;

	public DvdState getDvdState() {
		return dvdState;
	}

	public void setDvdState(DvdState dvdState) {
		this.dvdState = dvdState;
	}
}

DvdState.class

public class DvdState {
	public int time;
	public int volume;
	public int luminance;
	public DvdState(DvdDisc dvdDisc){
		time = dvdDisc.getTime();
		volume = dvdDisc.getVolume();
		luminance = dvdDisc.getLuminance();
	}
	public int getTime() {
		return time;
	}

	public int getVolume() {
		return volume;
	}

	public void setVolume(int volume) {
		this.volume = volume;
	}

	public int getLuminance() {
		return luminance;
	}

	public void setLuminance(int luminance) {
		this.luminance = luminance;
	}

	public void setTime(int time) {
		this.time = time;
	}
}

Main.class

public class Main {
	public static void main(String[] args) throws InterruptedException {
		// TODO Auto-generated method stub
		//第一次播放
		DvdMachine dvdMachine = new DvdMachine();
		DvdDisc dvdDisc = new DvdDisc();
		dvdMachine.setDvdDisc(dvdDisc);
		dvdMachine.startPlay();
		dvdMachine.stopPlay();
		//备份
		DvdStateManager dvdStateManager = new DvdStateManager();
		dvdStateManager.setDvdState(new DvdState(dvdDisc));
		//第二次播放赋予备份数据(如果右备份的数据采取备份)
		if(dvdStateManager.getDvdState() != null){
			dvdDisc.setTime(dvdStateManager.getDvdState().getTime());
			dvdDisc.setVolume(dvdStateManager.getDvdState().getVolume());
			dvdDisc.setLuminance(dvdStateManager.getDvdState().getLuminance());
		}
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值