设计模式系列——备忘录模式

原创:花括号MC(微信公众号:huakuohao-mc),欢迎分享,转载请保留出处。

备忘录模式用于备份对象的部分内部状态,在需要的时候,将对象状态恢复到原来的样子。

举个例子

假设日常玩儿游戏的时候,希望自己的角色在打个大boss的时候先保存一下角色状态,如果打boss失败则恢复到原来的状态,以便重新开始。这个时候我们可以考虑使用备忘录模式。

来看一下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());
    }
}
复制代码

总结

备忘录模式是行为模式之一,比较适用于功能比较复杂的,但需要维护或记录属性历史的类,或者众多属性中的一小部分。也是日常使用频率比较高的一种设计模式。

本文参考 www.tutorialspoint.com/design_patt…

猜你喜欢

转载自juejin.im/post/7080336957628219406