【问题标题】:What is the need for Memento Design Pattern in Calculator undo scenarioCalculator undo 场景中对 Memento 设计模式的需求是什么
【发布时间】:2014-08-05 22:58:08
【问题描述】:

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

【问题讨论】:

    标签: java design-patterns undo memento


    【解决方案1】:

    来源Memento Pattern

    动机

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

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

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

    【讨论】:

    • 所以,计算器对象会变大计算器不会遵守 SRP..这两个设计缺陷会是如果我使用 Memento 模式可以避免?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2019-11-24
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多