设计模式 十三、备忘录模式

备忘录 Memento 模式:
在不破坏封装性的前提下,捕获一个对象的内在状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原来的状态。

Originator 发起人:
负责创建一个备忘录 Memento 用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。
Originator 可根据需要决定 Memento 储存 Originator 的哪些内部状态。

Memento 备忘录:
负责存储 Originator 对象的内部状态, 并可防止 Originator 以外的其他对象访问备忘录 Memento ,备忘录有两个接口, Caretaker 只能看到窄接口,他只能将备忘录传递给其他对象, Originator可以看到宽接口,允许他访问返回到先前状态所需的所有数据。

Caretaker 管理者:
负责保存好备忘录 Memento ,不能对备忘录的内容进行操作或修改。

备忘录模式把要保存的细节封装在了 Memnto 中,哪一天要改细节也不需要影响客户端。

备忘录模式适用于功能比较复杂的,但需要维护或记录属性历史的类,或者需要保存的属性也只是众多属性中的一小部分时, Originator 可以根据保存的 Memento 信息还原到前一状态。

//备忘录
public class Memento {
    
    
    private String state;

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

    public String getState() {
    
    
        return state;
    }
}

//管理者
public class Caretaker {
    
    
    private Memento memento;

    //得到或设置备忘录
    public Memento getMemento() {
    
    
        return memento;
    }

    public void setMemento(Memento memento) {
    
    
        this.memento = memento;
    }

}

//发起人 类
public class Originator {
    
    
    private String state;           //需要保存的属性,可以多个

    public String getState() {
    
    
        return state;
    }

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

    //创建备忘录,将当前需要保存的信息导入并实例化出一个 Memento 对象
    public Memento CreateMemento() {
    
    
        return new Memento(state);
    }

    //恢复备忘录,将 Memento 导入并将相关数据恢复
    public void SetMemnto(Memento memento) {
    
    
        state = memento.getState();
    }

    public void Show() {
    
    
        System.out.println(state);
    }

    public static void main(String[] args) {
    
    
        //初始化发起人和初始状态
        Originator originator = new Originator();

        originator.setState("满血");
        originator.Show();

        //保存状态,由于有了封装性,可以隐藏发起人 Originator 的细节
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(originator.CreateMemento());

        //更新了状态
        originator.setState("残血");
        originator.Show();

        //恢复备忘录状态
        originator.SetMemnto(caretaker.getMemento());

        originator.Show();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45401129/article/details/114629461
今日推荐