在计算机撤消场景中对Memento设计模式的需求是什么

时间:2014-06-16 07:07:42

标签: java design-patterns undo memento

我正在阅读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模式?

1 个答案:

答案 0 :(得分:1)

来源Memento Pattern

  

<强>动机

     

有时需要捕获对象的内部状态   在某些时候,并有能力将对象恢复到该状态   以后的时间。这种情况在出错或失败时很有用。

     

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

     

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