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());
}
}
}