什么是需要纪念品设计模式在计算器撤销方案



我正在阅读关于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

它可以很好地撤消。为什么我要在这种情况下使用记忆碎片模式?

来源纪念品图案

有时需要捕获对象的内部状态并且有能力将对象恢复到该状态以后再说吧。这种情况在错误或失败的情况下是有用的。

考虑具有撤消操作的计算器对象的情况,如计算器可以简单地维护所有先前操作的列表它已经执行,因此能够恢复先前的它已执行的计算。这将导致计算器对象变得更大、更复杂、更重量级,就像计算器一样对象必须提供额外的撤销功能,并且应该维护所有先前操作的列表。

这个功能可以移出计算器类,这样外部(我们称之为undo manager类)可以收集计算器的内部状态并保存。然而,提供显式访问每个状态变量的计算器恢复管理器是不切实际的,并且会违反封装原则。

最新更新