设计理念:
时刻记着Memento类好比一个模具,真正实验存储状态的是Caretaker类,当然,起最大作用的就是Originator了,既通过模具来创造状态,又可以进行过去状态的转变。
象棋备忘录:
public class ChessMemento {
private int x,y;
private String name;
public ChessMemento() {}
public ChessMemento(int x, int y, String name) {
super();
this.x = x;
this.y = y;
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
象棋原发器:
可用来定义初始状态,调用任一时刻的状态
public class ChessOriginator {
private int x,y;
private String name;
public ChessOriginator() {}
public ChessOriginator(int x, int y, String name) {
super();
this.x = x;
this.y = y;
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;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ChessMemento createChessMemento() {
return new ChessMemento(x,y,name);
}
public void setChessMemento(ChessMemento chessMemento) {
this.name=chessMemento.getName();
this.x=chessMemento.getX();
this.y=chessMemento.getY();
}
public void display() {
String str="name:"+name+" X:"+x+" Y:"+y;
System.out.println(str);
}
}
管理类:
public class ChessCaretaker {
private ChessMemento chessMemento;
public ChessMemento getChessMemento() {
return chessMemento;
}
public void setChessMemento(ChessMemento chessMemento) {
this.chessMemento = chessMemento;
}
}
客户端:
public class ChessMain {
public static void main(String[] args) {
ChessOriginator chessOriginator=new ChessOriginator();
ChessCaretaker chessCaretaker=new ChessCaretaker();
chessOriginator.setName("炮");
chessOriginator.setX(1);
chessOriginator.setY(2);
chessOriginator.display();
chessCaretaker.setChessMemento(chessOriginator.createChessMemento());
chessOriginator.setName("炮");
chessOriginator.setX(4);
chessOriginator.setY(2);
chessOriginator.display();
chessOriginator.setChessMemento(chessCaretaker.getChessMemento());
chessOriginator.display();
}
}
另外,若是悔棋多步,则采用下面的代码
象棋管理类:
public class ChessCaretaker1 {
private ArrayList<ChessMemento> list=null;
public ChessCaretaker1() {
list=new ArrayList<ChessMemento>();
}
public void addChessMemento(ChessMemento c){
list.add(c);
}
public ChessMemento getChessMemento() {
if(list.isEmpty()) {
System.out.println("无法悔棋");
return null;
}else {
int index=list.size();
ChessMemento c=(ChessMemento)list.get(index-1);
list.remove(index-1);
return c;
}
}
}
客户端:
public class ChessMain1 {
public static void main(String[] args) {
ChessCaretaker1 chessCaretaker=new ChessCaretaker1();
chessCaretaker.getChessMemento();
ChessOriginator chessOriginator=new ChessOriginator();
chessOriginator.setName("炮");
chessOriginator.setX(1);
chessOriginator.setY(2);
chessOriginator.display();
chessCaretaker.addChessMemento(chessOriginator.createChessMemento());
chessOriginator.setName("炮");
chessOriginator.setX(4);
chessOriginator.setY(2);
chessOriginator.display();
chessCaretaker.addChessMemento(chessOriginator.createChessMemento());
chessOriginator.setName("炮");
chessOriginator.setX(4);
chessOriginator.setY(10);
chessOriginator.display();
chessCaretaker.addChessMemento(chessOriginator.createChessMemento());
chessOriginator.setChessMemento(chessCaretaker.getChessMemento());
chessOriginator.display();
chessOriginator.setChessMemento(chessCaretaker.getChessMemento());
chessOriginator.display();
}
}