设计模式之备忘录模式
来源:互联网 发布:彩票计划软件开发 编辑:程序博客网 时间:2024/04/29 17:39
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());}}}
- 设计模式之备忘录
- 设计模式之备忘录
- 设计模式之备忘录
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式之备忘录模式
- 设计模式 之 备忘录模式
- 设计模式之备忘录模式
- Android去掉标题栏和全屏
- IOS 内存管理
- HDU 1284
- HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)
- IOS沙盒(sandbox)机制和文件操作(三)
- 设计模式之备忘录模式
- C++的中英文字符串表示(string,wstring)
- POJ1012 Joseph解题报告
- C++常量(C++数值常量、字符串常量、符号常量)
- 微信公众平台开发(39)支付宝手机网站支付
- Codeforces Round #192 (Div. 2) B
- 7.23
- 编写软件动态加载NT式驱动
- 【体系结构】转移预测器性能的定量评价