撤销功能的实现——备忘录模式(三)

194 篇文章 12 订阅
189 篇文章 401 订阅

21.3 完整解决方案

      为了实现撤销功能,Sunny公司开发人员决定使用备忘录模式来设计中国象棋软件,其基本结构如图21-4所示:

      在图21-4中,Chessman充当原发器,ChessmanMemento充当备忘录,MementoCaretaker充当负责人,在MementoCaretaker中定义了一个ChessmanMemento类型的对象,用于存储备忘录。完整代码如下所示:

//象棋棋子类:原发器
class Chessman {
	private String label;
	private int x;
	private int y;

	public Chessman(String label,int x,int y) {
		this.label = label;
		this.x = x;
		this.y = y;
	}

	public void setLabel(String label) {
		this.label = label; 
	}

	public void setX(int x) {
		this.x = x; 
	}

	public void setY(int y) {
		this.y = y; 
	}

	public String getLabel() {
		return (this.label); 
	}

	public int getX() {
		return (this.x); 
	}

	public int getY() {
		return (this.y); 
	}
	
    //保存状态
	public ChessmanMemento save() {
		return new ChessmanMemento(this.label,this.x,this.y);
	}
	
    //恢复状态
	public void restore(ChessmanMemento memento) {
		this.label = memento.getLabel();
		this.x = memento.getX();
		this.y = memento.getY();
	}
}

//象棋棋子备忘录类:备忘录
class ChessmanMemento {
	private String label;
	private int x;
	private int y;

	public ChessmanMemento(String label,int x,int y) {
		this.label = label;
		this.x = x;
		this.y = y;
	}

	public void setLabel(String label) {
		this.label = label; 
	}

	public void setX(int x) {
		this.x = x; 
	}

	public void setY(int y) {
		this.y = y; 
	}

	public String getLabel() {
		return (this.label); 
	}

	public int getX() {
		return (this.x); 
	}

	public int getY() {
		return (this.y); 
	}	
}

//象棋棋子备忘录管理类:负责人
class MementoCaretaker {
	private ChessmanMemento memento;

	public ChessmanMemento getMemento() {
		return memento;
	}

	public void setMemento(ChessmanMemento memento) {
		this.memento = memento;
	}
}

      编写如下客户端测试代码:

class Client {
	public static void main(String args[]) {
		MementoCaretaker mc = new MementoCaretaker();
		Chessman chess = new Chessman("车",1,1);
		display(chess);
		mc.setMemento(chess.save()); //保存状态		
		chess.setY(4);
		display(chess);
		mc.setMemento(chess.save()); //保存状态
		display(chess);
		chess.setX(5);
		display(chess);
		System.out.println("******悔棋******");	
		chess.restore(mc.getMemento()); //恢复状态
		display(chess);
	}
	
	public static void display(Chessman chess) {
		System.out.println("棋子" + chess.getLabel() + "当前位置为:" + "第" + chess.getX() + "行" + "第" + chess.getY() + "列。");
	}
}

      编译并运行程序,输出结果如下: 

棋子车当前位置为:第1行第1列。

棋子车当前位置为:第1行第4列。

棋子车当前位置为:第1行第4列。

棋子车当前位置为:第5行第4列。

******悔棋******

棋子车当前位置为:第1行第4列。


【作者:刘伟  http://blog.csdn.net/lovelion

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
备忘录模式是一种行为型设计模式,可以让程序在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以恢复到之前的某个状态。 在前端中,我们可以使用备忘录模式实现一些具有撤销操作的功能,例如撤回上一步操作、恢复被删除的数据等。 下面是一个简单的备忘录模式实现: ```javascript // 备忘录类 class Memento { constructor(state) { this.state = state; } getState() { return this.state; } } // 发起人类 class Originator { constructor() { this.state = null; } setState(state) { this.state = state; } getState() { return this.state; } saveStateToMemento() { return new Memento(this.state); } getStateFromMemento(memento) { this.state = memento.getState(); } } // 管理者类 class CareTaker { constructor() { this.mementos = []; } addMemento(memento) { this.mementos.push(memento); } getMemento(index) { return this.mementos[index]; } } // 使用示例 const originator = new Originator(); const careTaker = new CareTaker(); // 第一次保存状态 originator.setState('State #1'); careTaker.addMemento(originator.saveStateToMemento()); // 第二次保存状态 originator.setState('State #2'); careTaker.addMemento(originator.saveStateToMemento()); // 恢复到第一次保存的状态 originator.getStateFromMemento(careTaker.getMemento(0)); console.log(originator.getState()); // 输出 "State #1" ``` 在这个例子中,我们定义了个类:备忘录类、发起人类和管理者类。发起人类用来创建和恢复备忘录,管理者类用来管理备忘录的集合。在这个例子中,我们将发起人类的状态保存到备忘录中,并将备忘录存储到管理者类中,以便以后可以恢复到之前的某个状态。 当需要撤销操作时,我们可以从管理者类中获取之前保存的备忘录,并将其恢复到发起人类中。这样,发起人类就可以回到之前的状态了。 当然,这只是一个简单的例子,实际应用中可能需要更多的代码来实现具体的功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值