デザインパターンシリーズ-メモパターン

オリジナル:中かっこMC(WeChatパブリックアカウント:huakuohao-mc)、共有を歓迎します。転載のソースを保管してください。

mementoパターンは、オブジェクトの内部状態の一部をバックアップし、必要に応じてオブジェクトの状態を元の状態に復元するために使用されます。

例えば

毎日ゲームをプレイするときに、大きなボスに当たったときに最初にキャラクターの状態を保存し、ボスを倒せなかった場合は元の状態に戻してやり直すことができるようにしたいとします。現時点では、メモモードの使用を検討できます。

写真を見てくださいUML

memento.png

特定のコード実装を見てください

まず、メモを作成して、記録する必要のあるステータスを記録します。

public class Memento {
    //需要保存的状态,可以是多个
    private String state;

    public Memento(String state){
        this.state = state;
    }

    public String getState(){
        return state;
    }
}
复制代码

ゲームキャラクターを定義し、キャラクター内にメモを作成し、対応する状態をメモに保存します。

public class GameRole {
    //游戏状态
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    //将状态存入备忘录
    public Memento saveStateToMemento(){
        return new Memento(state);
    }

    //从备忘录获取状态
    public void getStateFromMemento(Memento memento){
        state = memento.getState();
    }
}
复制代码

メモに状態を保存および復元するための管理クラスを定義します。

public class CareTaker {
    //备份多个状态
    private List<Memento> mementoList = new ArrayList<Memento>();
    
    public void add(Memento memento){
        mementoList.add(memento);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}
复制代码

クライアントはこれを使用します

public class MementoPatternDemo {

    public static void main(String[] args){
        GameRole gameRole = new GameRole();
        CareTaker careTaker = new CareTaker();

        gameRole.setState("State #1");
        gameRole.setState("State #2");

        careTaker.add(gameRole.saveStateToMemento());

        gameRole.setState("State #3");
        careTaker.add(gameRole.saveStateToMemento());

        gameRole.setState("State #4");
        System.out.println("Current State: " + gameRole.getState());

        gameRole.getStateFromMemento(careTaker.get(0));
        System.out.println("First saved State: " + gameRole.getState());

        gameRole.getStateFromMemento(careTaker.get(1));
        System.out.println("Second saved State: " + gameRole.getState());
    }
}
复制代码

要約する

メモパターンは動作パターンの1つであり、複雑な関数を持つクラスに適していますが、プロパティの履歴、または多くのプロパティのごく一部を維持または記録する必要があります。また、日常の使用頻度が比較的高いデザインパターンでもあります。

この記事は www.tutorialspoint.com/design_patt…を参照しています

おすすめ

転載: juejin.im/post/7080336957628219406