设计模式——备忘录模式(本质:保存和恢复内部状态)
一、定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可以将该对象恢复到原先保存的状态。
二、组成部分:
1、原发器角色Originator:创建备忘录,并存储其内部状态,或者利用备忘录恢复状态;
2、备忘录角色Memento:保存原发器的状态,内部结构和原发器类似;
3、负责人角色Caretaker:存储备忘录对象,一个大容器。。。
三、基本代码:
//原发器
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento createMemento() {
return new Memento(state);
}
public void show() {
System.out.println("dang qian zhuang tai is:"+state);
}
public void renew(Memento memento) {
this.state=memento.getState();
}
}
//备忘录
public class Memento {
private String state;
public Memento(String state) {
this.state=state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
//管理者
package 通用代码;
public class Caretaker {
private Memento memento=null;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
//客户端
package 通用代码;
public class Client {
public static void main(String[] args) {
Originator or=new Originator();
or.setState("a");
or.show();
Caretaker c=new Caretaker();
c.setMemento(or.createMemento());
or.setState("b");
or.show();
or.renew(c.getMemento());//直接传递 一个备忘录对象
or.show();
}
}
四:补充示例:象棋悔棋(只悔一步,多步管理者中开个容器保存所有状态)
代码实现:
package 象棋悔棋;
public class ChessMan {
private String name;
private int x,y;
public ChessMan(String string, int i, int j) {
this.name=string;
this.x=i;
this.y=j;
}
public ChessManMemento saveMemento() {//保存状态
return new ChessManMemento(name,x,y);
}
public void recoveryMemento(ChessManMemento cmm) { //悔棋
this.name=cmm.getName();
this.x=cmm.getX();
this.y=cmm.getY();
}
public void show() {
System.out.println(name+":("+x+","+y+")");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
package 象棋悔棋;
public class ChessManMemento {
private String name;
private int x,y;
public ChessManMemento(String name, int x, int y) {
this.name=name;
this.x=x;
this.y=y;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
package 象棋悔棋;
public class ChessCaretaker {
private ChessManMemento cmm=null;
public ChessManMemento getCmm() {
return cmm;
}
public void setCmm(ChessManMemento cmm) {
this.cmm = cmm;
}
}
package 象棋悔棋;
public class Client {
public static void main(String[] args) {
ChessMan c=new ChessMan("马",1,2);//初始化
c.show();
ChessCaretaker caretaker=new ChessCaretaker();
caretaker.setCmm(c.saveMemento());//保存状态
c.setX(0);//走下一步
c.setY(0);
c.show();
c.recoveryMemento(caretaker.getCmm());//悔棋,只能悔一步
c.show();
}
}
The end;