首页 > 代码库 > 设计模式-备忘录模式实现悔棋操作
设计模式-备忘录模式实现悔棋操作
利用设计模式中的备忘录模式实现多步悔棋的操作
1 import java.util.*; 2 class Chessman { 3 private String label; 4 private int x; 5 private int y; 6 public static int index=-1; 7 public Chessman(String label,int x,int y) { 8 this.label = label; 9 this.x = x; 10 this.y = y; 11 } 12 13 public void setLabel(String label) { 14 this.label = label; 15 } 16 17 public void setX(int x) { 18 this.x = x; 19 } 20 21 public void setY(int y) { 22 this.y = y; 23 } 24 25 public String getLabel() { 26 return (this.label); 27 } 28 29 public int getX() { 30 return (this.x); 31 } 32 33 public int getY() { 34 return (this.y); 35 } 36 37 //保存状态 38 public ChessmanMemento save() { 39 return new ChessmanMemento(this.label,this.x,this.y); 40 } 41 42 //恢复状态 43 public void restore(ChessmanMemento memento) { 44 this.label = memento.getLabel(); 45 this.x = memento.getX(); 46 this.y = memento.getY(); 47 } 48 public void display() { 49 System.out.println("棋子" + label + "当前位置为:" + "第" + x + "行" + "第" + y + "列。"); 50 } 51 public void play(MementoCaretaker mc,int toX,int toY) { 52 index ++; 53 mc.setMemento(this.save()); //保存备忘录 54 this.setX(toX); 55 this.setY(toY); 56 System.out.println("棋子" + label + "当前位置为:" + "第" + x + "行" + "第" + y + "列。"); 57 } 58 public void undo(MementoCaretaker mc,int i) { 59 try 60 { 61 mc.getMemento(i+2); 62 } 63 catch(Exception e) 64 { 65 mc.setMemento(this.save()); //保存备忘录 66 } 67 System.out.println("******悔棋******"); 68 this.index --; 69 this.restore(mc.getMemento(i)); //撤销到上一个备忘录 70 System.out.println("棋子" + label + "当前位置为:" + "第" + x + "行" + "第" + y + "列。"); 71 } 72 73 //撤销悔棋 74 public void redo(MementoCaretaker mc,int i) { 75 System.out.println("******撤销悔棋******"); 76 this.restore(mc.getMemento(i+2)); //恢复到下一个备忘录 77 this.index ++; 78 System.out.println("棋子" + label + "当前位置为:" + "第" + x + "行" + "第" + y + "列。"); 79 } 80 } 81 82 //象棋棋子备忘录类:备忘录 83 class ChessmanMemento { 84 private String label; 85 private int x; 86 private int y; 87 88 public ChessmanMemento(String label,int x,int y) { 89 this.label = label; 90 this.x = x; 91 this.y = y; 92 } 93 94 public void setLabel(String label) { 95 this.label = label; 96 } 97 98 public void setX(int x) { 99 this.x = x; 100 } 101 102 public void setY(int y) { 103 this.y = y; 104 } 105 106 public String getLabel() { 107 return (this.label); 108 } 109 110 public int getX() { 111 return (this.x); 112 } 113 114 public int getY() { 115 return (this.y); 116 } 117 } 118 119 class MementoCaretaker { 120 //定义一个集合来存储多个备忘录 121 private ArrayList mementolist = new ArrayList(); 122 123 public ChessmanMemento getMemento(int i) { 124 return (ChessmanMemento)mementolist.get(i); 125 } 126 127 public void setMemento(ChessmanMemento memento) { 128 mementolist.add(memento); 129 } 130 } 131 132 133 class Client { 134 public static void main(String args[]) { 135 MementoCaretaker mc = new MementoCaretaker(); 136 Chessman chess = new Chessman("车",1,1);//ArrayList[0]的内容,index=-1; 137 chess.display(); 138 chess.play(mc,1,2);//ArrayList[1]的内容,index=0 139 chess.play(mc,2,3);//ArrayList[2]的内容,index=1 140 chess.play(mc,4,5);//ArrayList[3]的内容,index=2 (还没存); 141 chess.undo(mc,chess.index);//2,1 142 chess.undo(mc,chess.index);//1,0 143 chess.undo(mc,chess.index);//0,-1 144 chess.redo(mc,chess.index);//需要ArrayList[1]的内容,此时index=-1;所以i要+2,index++得0 145 chess.redo(mc,chess.index);//需要ArrayList[2]的内容,此时index为0,---------,index++得1 146 chess.redo(mc,chess.index); 147 } 148 }
思路参考--刘伟技术博客
设计模式-备忘录模式实现悔棋操作
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。