zoukankan      html  css  js  c++  java
  • 大话设计模式之备忘录模式

    备忘录模式

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

    涉及到的角色描述

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

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

      caretaker(管理者): 负责保存好备忘录memento,不能对备忘录的内容进行操作或检查。

    优点: 

      1、给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。

      2、实现了信息的封装,使得用户不需要关心状态的保存细节。

    缺点:

      消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

    使用场景: 

      1、需要保存/恢复数据的相关状态场景。

      2、提供一个可回滚的操作。

    具体代码实现

      创建备忘录

    package com.chenpt.designModel.mementoModel;
    
    /**
     * @Author: chen
     * @Description: 备忘录类
     * @Date: created in 2018/8/28
     * @Modified By:
     */
    public class Memento {
    
        private String state;
    
        //构造方法将相关数据导入
        Memento(String state){
            this.state = state;
        }
    
        //需要保存的数据属性,可以是多个
        public String getState() {
            return state;
        }
    
    
    }
    

      创建发起人

    package com.chenpt.designModel.mementoModel;
    
    /**
     * @Author: chen
     * @Description: 发起人
     * @Date: created in 2018/8/28
     * @Modified By:
     */
    public class Originator {
        private String state;//需要保存的属性
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        /**
         * 创建备忘录,将当前需要保存的数据导入并实例化一个memento对象
         * @return
         */
        public Memento setStateToMemento(){
            return new Memento(state);
        }
    
        /**
         * 恢复备忘录,将memento导入并将相关数据恢复
         * @param memento
         */
        public void getStateFromMemento(Memento memento){
            state = memento.getState();
        }
    
        /**
         * 数据展示
         */
        public void show(){
            System.out.println(state);
        }
    }
    

      创建管理者

    package com.chenpt.designModel.mementoModel;
    
    /**
     * @Author: chen
     * @Description: 管理者
     * @Date: created in 2018/8/28
     * @Modified By:
     */
    public class CareTaker {
        private Memento memento;//得到或设置备忘录
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    

      客户端

    package com.chenpt.designModel.mementoModel;
    
    /**
     * @Author: chen
     * @Description:
     * @Date: created in 2018/8/28
     * @Modified By:
     */
    public class MainTest {
    
        public static void main(String[] a){
            Originator originator = new Originator();
            originator.setState("on");
            originator.show();
    
            CareTaker careTaker = new CareTaker();
            careTaker.setMemento(originator.setStateToMemento());
    
            originator.setState("off");
            originator.show();
    
            originator.getStateFromMemento(careTaker.getMemento());
            originator.show();
        }
    
    }
    //执行结果
    on
    off
    on
    

      

  • 相关阅读:
    链表基础及常见面试题
    浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)
    PHP函数高级(二)
    sql注入笔记
    PHPStorm2017去掉参数提示 parameter name hints
    CDN与智能DNS原理和应用
    用户黏性与垂直社区,互联网营销 狼人:
    我在赶集网的两个月(完整版),互联网营销 狼人:
    微博变种与RSS变种,互联网营销 狼人:
    从 Reddit 学到的经验,互联网营销 狼人:
  • 原文地址:https://www.cnblogs.com/chenpt/p/9547988.html
Copyright © 2011-2022 走看看