デザインの禅——覚書モード
14886 ワード
引用する
メモモードは非常に簡単なモードで、エディタのctrl+z、データベーストランザクションのロールバック、ゲームのアーカイブなど、アプリケーションシーンが非常に広く、バックアップ(なぜメモモードと呼ばれているのか疑問で、バックアップモードと呼ばれているのが適切ではないか).
詳しく説明する
メモモードは、1つのオブジェクトの内部状態をオブジェクトの外部に保存することで、将来のいずれかの時点で前の状態に戻すことができ、後悔薬を飲むことができます.発起人(originator)、メモ(memento)、責任者(caretaker)の3つの役割が含まれています.
メモモードは、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());
}
出力は次のとおりです.
:1
:2
:3
:4
:3
:2
:1
これにより、単一のステータスのメモモードを実現しましたが、実際の応用では、ビジネスシーンが複雑になり、多くのステータスを保存する必要がある可能性があります.どうすればいいのでしょうか.読者の皆さんは自分で考えてみてください.ここでは展開しません.