備忘錄模式
想象這樣的一種場景,當你在玩象棋遊戲時,這個時候你可能在落子的下一秒意識到這一步棋不可以這樣下,這時你的第一個反應就是點擊悔棋,回到落子之前的狀態。而問題是如何存儲上一個狀態,這個時候就可以使用設計模式中的備忘錄模式。
備忘錄模式分爲三個對象:
Originator(發起人):負責創建一個備忘錄Memento,用以記錄當前時刻自身的內部狀態,並可使用備忘錄恢復內部狀態。Originator可以根據需要決定Memento存儲自己的哪些內部狀態。
Memento(備忘錄):負責存儲Originator對象的內部狀態,並可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態所需要的所有數據。
Caretaker(管理者):負責備忘錄Memento,不能對Memento的內容進行訪問或者操作。
三個對象各有各的功能總體來說就是發起人進行對以往的狀態進行獲取或者存儲此時的狀態,管理者則是存儲着備份的狀態,而備忘錄就是存儲狀態的各種屬性的一種載體,就像是發起人與管理者之間的一個橋樑,進行信息的交流。
利用這個模式就可以進行實現象棋悔棋這個功能
發起人
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;
}
}
備忘錄
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;
}
}
管理者
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可以間接使用這些方法。