zoukankan      html  css  js  c++  java
  • 备忘录模式 详解

    定义

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;

    行为型模式

    角色

    • 发起人角色(Originator):记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据;
    • 备忘录角色(Memento):负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态;
    • 管理者角色(Caretaker):对备忘录 进行管理,保存和提供备忘录;

    从网上找到的例图
    enter image description here


    适用场景

    • 需要保存一个对象在某一个时刻的状态或者部分状态;
    • 如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象不希望外界直接访问其内部状态,通过负责人可以间接访问其内部状态;

    例子

    • 这个就像你写代码,当你不小心删除了几行代码,这个时候你只需要command + z 就可以返回,这就像备忘录模式,系统帮你保存之前的状态;

    实现代码

    /**
     * Created by George on 16/7/16.
     */
    // 发起角色
    var Originator = function () {
        this.getState = function () {
            return this.state;
        };
        this.setState = function (state) {
            this.state = state;
        };
        this.createMemento = function () {
            return new Memento(this.state);
        };
        this.restoreMemento = function (memento) {
            this.setState(memento.getState());
        };
    };
    
    // 备忘录
    var Memento = function (state) {
        this.state = state;
    
        this.getState = function () {
            return this.state;
        };
    
        this.setState = function (state) {
            this.state = state;
        };
    };
    
    // 负责人角色
    var Caretaker = function () {
        this.memento = null;
        this.getMemento = function () {
            return this.memento;
        };
    
        this.setMemento = function (memento) {
            this.memento = memento;
        };
    };
    
    var originator = new Originator();
    originator.setState("状态1 ");
    console.log("初始状态 " + originator.getState());
    
    var caretaker = new Caretaker();
    caretaker.setMemento(originator.createMemento());
    originator.setState("状态2 ");
    
    console.log("改变后状态 " + originator.getState());
    
    originator.restoreMemento(caretaker.getMemento());
    
    console.log("恢复状态 " + originator.getState());
    
    

    实现结果:
    这里写图片描述


    优缺点

    1. 当发起人角色中的状态改变的时候,可以还原到之前的状态;
    2. 备份的状态是保存在发起人角色之外的,这样发起人角色就不需要对各个备份的状态进行管理;

    注意的是

    1. 备忘录模式都是多状态和多备份的,发起人角色的状态需要存储到备忘录对象中,对资源的消耗是不叫严重的;

    关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法

  • 相关阅读:
    针对数据库开发人员的性能调优小提示
    Oracle EBS 12 目录结构
    程序集反射
    DataTable.Select() 返回DataTable结果
    有趣的23中设计模式
    『原创』用C++开发WM应用系列(5)——接触ListBox控件
    『原创』用C++开发WM应用系列(1)——"Hello World" Pro!(上)
    【参考】在PPC上面检查文件MD5
    用C++开发WM应用系列文章索引
    『原创』用C++开发WM应用系列(1)——"Hello World" Pro!(下)
  • 原文地址:https://www.cnblogs.com/George1994/p/6037625.html
Copyright © 2011-2022 走看看