デザインの禅——覚書モード

14886 ワード

引用する


メモモードは非常に簡単なモードで、エディタのctrl+z、データベーストランザクションのロールバック、ゲームのアーカイブなど、アプリケーションシーンが非常に広く、バックアップ(なぜメモモードと呼ばれているのか疑問で、バックアップモードと呼ばれているのが適切ではないか).

詳しく説明する


メモモードは、1つのオブジェクトの内部状態をオブジェクトの外部に保存することで、将来のいずれかの時点で前の状態に戻すことができ、後悔薬を飲むことができます.発起人(originator)、メモ(memento)、責任者(caretaker)の3つの役割が含まれています.
  • イニシエータ:バックアップを作成し、現在のオブジェクトに必要なストレージの状態を外部に保存し、必要に応じてバックアップをリカバリできます.
  • メモ:オブジェクトの内部状態を格納します.
  • 責任者:メモを保存したり、他のオブジェクトにメモを渡したりするために使用されますが、操作メモオブジェクトの内部状態(パッケージ性と安全性を保証する)に直接アクセスすることはできません.

  • スキーマの構造と定義は非常に簡単で、テキストエディタの「元に戻す」機能を実現します.

    Coding


    まずエディタオブジェクトであり、次のような役割も開始されます.
    public class Editor {
    
        private String content;
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public Memento createMemento() {
            return new Memento(this.content);
        }
    
        public void undo(Memento memento) {
            this.content = memento.getContent();
        }
    }
    

    メモの対象:
    public class Memento {
    
        private String content;
    
        public Memento(String content) {
            this.content = content;
        }
    
        public String getContent() {
            return content;
        }
    }
    

    担当者は、メモの対象を保存・伝達する方法のみを提供し、メモの内部状態を修正することはできません(これは必須です.そうしないと、回復したデータが最初のデータであることを保証できません.メモモードには何の意味がありますか?):
    public class Caretaker {
    
        private Stack<Memento> mementos = new Stack<>();
    
        public void savePoint(Memento memento) {
            mementos.push(memento);
        }
    
        public Memento getMemento() {
            return mementos.pop();
        }
    
    }
    

    最後に、この強力なエディタを体験しましょう.
        public static void main(String[] args) {
            Editor editor = new Editor();
            editor.setContent("1");
            System.out.println(" :" + editor.getContent());
    
            //  
            Caretaker caretaker = new Caretaker();
            caretaker.savePoint(editor.createMemento());
            editor.setContent("2");
            System.out.println(" :" + editor.getContent());
            caretaker.savePoint(editor.createMemento());
            editor.setContent("3");
            System.out.println(" :" + editor.getContent());
            caretaker.savePoint(editor.createMemento());
            editor.setContent("4");
            System.out.println(" :" + editor.getContent());
    
            editor.undo(caretaker.getMemento());
            System.out.println(" :" + editor.getContent());
            editor.undo(caretaker.getMemento());
            System.out.println(" :" + editor.getContent());
            editor.undo(caretaker.getMemento());
            System.out.println(" :" + editor.getContent());
        }
    

    出力は次のとおりです.
    1234321
    

    これにより、単一のステータスのメモモードを実現しましたが、実際の応用では、ビジネスシーンが複雑になり、多くのステータスを保存する必要がある可能性があります.どうすればいいのでしょうか.読者の皆さんは自分で考えてみてください.ここでは展開しません.

    まとめ


    メモモードは「後悔薬」を提供し、必要に応じていつでも後悔することができますが、記録された状態が非常に多い場合、大量の資源を占有するため、使用時に合理的な上限を設定する必要があります.