备忘录模式
想象这样的一种场景,当你在玩象棋游戏时,这个时候你可能在落子的下一秒意识到这一步棋不可以这样下,这时你的第一个反应就是点击悔棋,回到落子之前的状态。而问题是如何存储上一个状态,这个时候就可以使用设计模式中的备忘录模式。 备忘录模式分为三个对象: Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。 Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。 Caretaker(管理者):负责备忘录Memento,不能对Memento的内容进行访问或者操作。 三个对象各有各的功能总体来说就是发起人进行对以往的状态进行获取或者存储此时的状态,管理者则是存储着备份的状态,而备忘录就是存储状态的各种属性的一种载体,就像是发起人与管理者之间的一个桥梁,进行信息的交流。 利用这个模式就可以进行实现象棋悔棋这个功能
发起人
代码语言:javascript复制package shejimoshi5_21;
public class ChessGame {
private Chess chess;
public ChessGame(Chess chess) {
this.chess = chess;
}
public void show()
{
for(Pieces p:chess.getList())
{
System.out.println(p.getName() " " p.getX() " " p.getY());
}
}
public void saveChess(Caretaker caretaker)
{
Chess c=new Chess(chess.getList());
caretaker.add(c);
}
public void back(Caretaker caretaker)
{
chess=caretaker.back();
}
public void setChess(Chess chess) {
this.chess = chess;
}
}
备忘录
代码语言:javascript复制public class Chess {
private LinkedList<Pieces> list;
public Chess(LinkedList<Pieces> lis) {
list=new LinkedList<Pieces>();
Pieces p2;
Iterator<Pieces> it=lis.iterator();
while(it.hasNext())
{
p2=new Pieces((Pieces)it.next());
list.addLast(p2);
}
}
public LinkedList<Pieces> getList() {
return list;
}
}
管理者
代码语言:javascript复制public class Caretaker {
private LinkedList<Chess> list;
int a=0;
public Caretaker() {
list=new LinkedList<Chess>();
}
public void add(Chess chess)
{
list.addLast(chess);
}
public Chess back()
{
Chess chess=list.getLast();
list.removeLast();
return chess;
}
}
总结:上述代码在写的时候没有考虑这么多,现在写博客的时候再看一遍感觉方法暴露的太多,像是Caretaker中add和back方法可以设置成private类型,和Chess的构造函数都可以添加一个中间方法使得ChessGame可以间接使用这些方法。