备忘录模式

一、定义

在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后就可将该对象恢复到原先保存的状态。

二、使用场景

需要保存一个对象在某一个时刻的状态或部分状态。

三、UML类图

备忘录模式

Originator:负责创建一个备忘录,可以记录、恢复自身的内部状态。
Memento:备忘录,用于存储Originator的内部状态。
Caretaker:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

四、实现

//发起者
public class Originator {
    private String state;

    public String getState() {
        return state;
    }
    
    public void setState(String state) {
        this.state = state;
    }
    
    public Memento createMemento() {
        return new Memento(state);
    }
    
    public void setMemento(Memento memento) {
        state = memento.getState();
    }
    
    public void show() {
        System.out.println("state: " + state);
    }
}

//备忘录
public class Memento {
    private Sting 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 Client {
    public static void main(String[] args) {
        Originator o = new Originator();
        o.setState("on");
        o.show();
        
        Caretaker c = new Caretaker();
        c.setMemento(o.createMemento());
        
        o.setState("off");
        o.show();
        
        o.setMemento(c.getMemento())
        o.show();
    }
}

五、应用

Android Activity 状态保存与恢复
在Android中,当某个Activity变得容易被系统销毁时(除非该Activity是被用户主动销毁的,如当用户按Back键),Activity#onSaveInstanceState方法就会被回调(在Activity#onStop方法回调之前),用于存储窗口的视图树的状态、存储Fragment的状态等。在重新启动该Activity时会判断是否有存储Activity的状态,如果有则回调Activity#onRestoreInstanceState方法恢复状态。这样就保证了在非正常情况退出Activity时不会丢失数据的情况,很好地提升了用户体验。
在这个过程中,ActivityThread扮演Caretaker角色,负责存储、恢复UI的状态信息;Activity、Fragment、View、ViewGroup等对象扮演Orginator角色,也就是需要存储状态的对象;Bundle则扮演Memento角色。

六、总结

备忘录模式是在不破坏封装的条件下,通过备忘录对象存储另外一个对象内部状态的快照,在将来合适的时候把这个对象还原到存储起来的状态。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容