/** * @author wuyimin * @create 2021-07-29 11:16 * @description 原发器角色 */ public class Chessman { //棋子的姓名 x,y坐标 private String chessName; private int x; private int y; public void show(){ System.out.println("棋子:"+chessName+"-> 坐标为<"+x+","+y+">"); } //保存当前状态 public ChessMemo save(){ return new ChessMemo(chessName,x,y); } //恢复当前状态 public void restore(ChessMemo memo){ this.chessName=memo.getChessName(); this.x=memo.getX(); this.y=memo.getY(); } public Chessman(String chessName, int x, int y) { this.chessName = chessName; this.x = x; this.y = y; } public String getChessName() { return chessName; } public void setChessName(String chessName) { this.chessName = chessName; } 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; } }
/** * @author wuyimin * @create 2021-07-29 11:21 * @description 对应备忘录角色 */ public class ChessMemo { //棋子的姓名 x,y坐标 private String chessName; private int x; private int y; public ChessMemo(String chessName, int x, int y) { this.chessName = chessName; this.x = x; this.y = y; } public String getChessName() { return chessName; } public void setChessName(String chessName) { this.chessName = chessName; } 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; } }
/** * @author wuyimin * @create 2021-07-29 11:23 * @description 负责人角色,负责管理备忘录 */ public class MementoCaretaker { private ArrayList<ChessMemo> list =new ArrayList<ChessMemo>(); public ChessMemo find(int i){ return list.get(i); } public void add(ChessMemo memo){ list.add(memo); } public int getCount(){ return list.size(); } }
客户端
public class Client { public static void main(String[] args) { Chessman chessman = new Chessman("白棋", 1, 1); play(chessman); chessman.setX(3); play(chessman); undo(chessman); undo(chessman); redo(chessman); redo(chessman); } private static int index=-1; private static MementoCaretaker mc=new MementoCaretaker(); //下棋同时输出保存 public static void play(Chessman chessman){ ChessMemo save = chessman.save(); mc.add(save); index++; chessman.show(); } //悔棋,撤销到上次的步骤 public static void undo(Chessman chessman){ System.out.println("---悔棋---"); if(index<=0){ System.out.println("悔棋失败"); }else{ index--; ChessMemo chessMemo = mc.find(index); chessman.restore(chessMemo); chessman.show(); } } //撤销悔棋 public static void redo(Chessman chessman){ System.out.println("--撤销悔棋--"); if(index>=mc.getCount()-1){ System.out.println("撤销悔棋失败"); }else{ index++; ChessMemo chessMemo = mc.find(index); chessman.restore(chessMemo); chessman.show(); } } }
备忘录模式的主要优点如下:
它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。
备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。
备忘录模式的主要缺点如下:
资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。