我正在阅读Memento设计模式。我遇到了一个谈论计算机撤销功能的例子。
我可以使用以下代码实现计算器撤消:
Calculator
public class Calculator implements Cloneable {
int num1;
int num2;
int result;
Stack<Calculator> states = new Stack<>();
public void setNum1(int num1) {
this.num1 = num1;
}
public void setNum2(int num2) {
this.num2 = num2;
}
public void setResult(int result) {
this.result = result;
}
public int add() throws CloneNotSupportedException{
result = num1 + num2;
states.add((Calculator) this.clone());
System.out.println("Caclulation done. ");
return result;
}
public void undo(){
states.pop();
Calculator calc = states.peek();
this.setNum1(calc.num1);
this.setNum2(calc.num2);
this.setResult(calc.result);
System.out.println("Undo done. ");
}
public void displayState(){
System.out.println("Current State: " + num1 + " + " + num2 + " = " + result);
}
}
CalculatorTest
Calculator calc = new Calculator();
calc.setNum1(10);
calc.setNum2(11);
calc.add();
calc.displayState();
calc.setNum1(12);
calc.setNum2(13);
calc.add();
calc.displayState();
calc.setNum1(16);
calc.setNum2(17);
calc.add();
calc.displayState();
calc.undo();
calc.displayState();
calc.undo();
calc.displayState();
Output
Caclulation done. Current State: 10 + 11 = 21 Caclulation done. Current State: 12 + 13 = 25 Caclulation done. Current State: 16 + 17 = 33 Undo done. Current State: 12 + 13 = 25 Undo done. Current State: 10 + 11 = 21
它适用于撤消。为什么我会在这种情况下使用Memento模式?
答案 0 :(得分:1)
<强>动机强>
有时需要捕获对象的内部状态 在某些时候,并有能力将对象恢复到该状态 以后的时间。这种情况在出错或失败时很有用。
考虑具有撤销操作的计算器对象的情况,例如 计算器可以简单地维护所有先前操作的列表 它已经执行,因此可以恢复以前的 已执行的计算。这会导致计算器对象 变得更大,更复杂,更重量级,作为计算器 对象必须提供额外的撤消功能,并且应该 维护以前所有操作的列表。
此功能可以移出计算器类,以便 外部(让我们称之为撤消管理器类)可以收集 计算器的内部状态并保存。但提供 显式访问计算器的每个状态变量 恢复经理是不切实际的,会违反 封装原则。