行为型模式之备忘录模式(Memento)

来源:互联网 发布:mac常用应用 编辑:程序博客网 时间:2024/05/19 00:50

一、模式介绍

        备忘录模式可以对一个对象的内部状态进行备份,以在一个合适的时机恢复到这个状态,例如编辑器软件可以恢复到上次修改的操作,备忘录模式的关键在于备份对象不应该破坏原对象的封装性,对于其内部状态,应该只能由自己来访问。


二、原理图


三、示例代码

import java.util.ArrayDeque;import java.util.Deque;class Memento {    String state1;    String state2;    public String getState1() {        return state1;    }    public void setState1(String state1) {        this.state1 = state1;    }    public String getState2() {        return state2;    }    public void setState2(String state2) {        this.state2 = state2;    }}class Subject {    private String data1;    private String data2;    public void setData1(String data1) {        this.data1 = data1;    }    public void setData2(String data2) {        this.data2 = data2;    }    /**     * 创建的备份对象,不应该被其它对象识别     */    public Memento createMemento() {        Memento memento = new Memento();        memento.setState1(data1);        memento.setState2(data2);        return memento;    }    /**     * 应该只能自己恢复数据,外部对象没有能力     */    public void recoverFromMemonto(Memento memento) {        data1 = memento.getState1();        data2 = memento.getState2();    }    @Override    public String toString() {        return "数据1:" + data1 + "\t数据2:" + data2;    }}// 外部 备忘录 保存器,不应该能够查看class BackupManager {//    Stack stack = new Stack();    Deque<Memento> stack = new ArrayDeque<Memento>();    void saveMemento(Memento memento) {        stack.push(memento);    }    Memento getMemento() {        return stack.pop();    }}public class T {    public static void main(String[] args) {        BackupManager backupManager = new BackupManager();// 外部对象,保存备忘录,不应该能够查看        Subject subject = new Subject();        subject.setData1("data1");        subject.setData2("data2");        System.out.println("原数据:" + subject.toString());        backupManager.saveMemento(subject.createMemento());        subject.setData1("newData1");        subject.setData2("newData2");        System.out.println("新数据:" + subject.toString());        subject.recoverFromMemonto(backupManager.getMemento());        System.out.println("恢复:" + subject.toString());    }}

输出:

原数据:数据1:data1数据2:data2新数据:数据1:newData1数据2:newData2恢复:数据1:data1数据2:data2

原创粉丝点击