前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抽丝剥茧——备忘录设计模式

抽丝剥茧——备忘录设计模式

作者头像
石的三次方
发布2021-01-05 22:29:28
3050
发布2021-01-05 22:29:28
举报
文章被收录于专栏:石的三次方

备忘录设计模式

兄弟们好,今天来和大家聊聊备忘录设计模式。

它的主要思想是:「保存一个对象在某一时刻的副本,并且该对象的副本在外部不可以被访问,同时该对象的副本可以被内部重新加载和修改」

看到这里,有没有想到我们的序列化。在学习IO流的时候我们可以通过Serializable实现对象的序列化,这个序列化的过程就是一个备忘录的过程,通过对当前对象序列化,包含当前的状态,当需要的时候再将这个状态加载进来。

我们常常见过的游戏存档就是这个实现原理,将所有涉及到对象全部序列化,包含在本地文件中,然后读档的时候再加载进去。

「我们来看一下它类图实现:」

它主要有三个角色:

  • Originator用来描述一个需要被进行备忘录的对象,「它可以主动的创建一个备忘录,并且设置其状态」
  • Memento备忘录对象,用来保存Originator对象的状态,提供两个接口用于读取和设置对象的状态
  • Caretake。执行具体的备忘录调用。「对于它而言备忘录仅仅可以查看,但不能修改」

我们来看一下具体的代码实现:

「备忘录接口,一个标识」

代码语言:javascript
复制
interface Memento{

}

「需要记录的对象,宽接口,可以访问备忘录的所有信息」

代码语言:javascript
复制
class Originator{
    private String state ;

    public Memento createMemento(){
        return new InnerMemento(state);
    }

    public void restoreState(Memento memento){
        this.state = ((InnerMemento)memento).getState();
    }

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

    class InnerMemento implements Memento{
        private String state ;

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

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

        public String getState() {
            return state;
        }
    }
}

「具体负责调用,窄接口,仅仅可以查看备忘录」

代码语言:javascript
复制
class Caretaker{
    private Originator originator ;
    public Caretaker(Originator originator){
        this.originator = originator ;
    }
    public Memento createMemento(){
        return originator.createMemento();
    }
    public void restoreState(Memento memento){
        originator.restoreState(memento);
    }
}

「具体调用」

代码语言:javascript
复制
public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker(originator);
        //保存当前状态
        Memento memento = caretaker.createMemento();

        originator.setState("我的");
        caretaker.createMemento();
    }

有没有发现,这个设计模式强调了一个安全访问的原则,通过对不同的接口实现了一个宽接口和窄接口,来实现不同层次的调用。这个模式常常会和命令设计模式联合起来,用来记录undo操作,例如mysql持久化。

好啦,今天的设计模式就到这里了,兄弟们,晚安。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 备忘录设计模式
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档