1

私はメメントのデザインパターンについて読んでいます。電卓の元に戻す機能について説明している例を見つけました。

以下のコードで電卓の元に戻すことができます。

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 パターンを使用するのはなぜですか?

4

1 に答える 1

1

ソースメメントパターン

動機

ある時点でオブジェクトの内部状態をキャプチャし、後でオブジェクトをその状態に復元する機能が必要な場合があります。このようなケースは、エラーや障害が発生した場合に役立ちます。

元に戻す操作を持つ電卓オブジェクトの場合を考えてみましょう。このような電卓は、以前に実行したすべての操作のリストを単純に維持できるため、以前に実行した計算を復元できます。電卓オブジェクトは追加の元に戻す機能を提供する必要があり、以前のすべての操作のリストを維持する必要があるため、これにより、電卓オブジェクトがより大きく、より複雑になり、重量が大きくなります。

この機能は、電卓クラスの外に移動できるため、外部 (元に戻すマネージャー クラスと呼びましょう) が電卓の内部状態を収集して保存できます。ただし、計算機のすべての状態変数への明示的なアクセスを復元マネージャーに提供することは非現実的であり、カプセル化の原則に違反します。

于 2014-06-16T07:12:20.763 に答える