zoukankan      html  css  js  c++  java
  • 设计模式

    备忘录模式:将对象的状态保存下来,以实现数据对象的还原和回滚操作。
    核心:备份和恢复,回档机制
    角色:

    • Originator发起人:被备份的对象(备份数据来源),由Originator决定备份范围,执行备份的创建和恢复
    • Memonte备份/存档
    • Caretaker管理类:管理所有的备份

    白箱模式备忘录

    白箱备忘录的设计下,客户端直接获取到Memonte对象,可以看见Memonte的功能列表,甚至通过反射修改Memonte中的数据(存在安全问题)

    // Originator对象,作为被备份的对象,同时需要负责创建备份和从备份恢复
    public class Originator {
        private String state;
    
        public Originator(String state){ this.state = state;}
    
        public String getState() { return state;}
    
        public void setState(String state) { this.state = state;}
    
        // 创建备份
        public Memonte createMonte(){
            return new Memonte(this.state);
        }
    
        // 从备份恢复
        public void restoreMemonte(Memonte memonte){
            this.state = memonte.getState();
        };
    
        public void show(){ System.out.println("State = " + this.state);}
    }
    
    // 备份,存储Originator中所需备份的状态
    public class Memonte {
        private String state;
    
        public Memonte(String state){ this.state = state;}
    
        public String getState() { return this.state;}
    }
    
    // 备份管理器,存储所有的备份,可以有不同的数据结构实现。(栈式的后进先出,Map类型的备份点订点恢复,双指针数组实现固定大小备忘录)
    public class Caretaker {
        public Memonte getMemonte() {
            return STACK.pop();
        }
    
        public void addMemonte(Memonte memonte) {
            STACK.push(memonte);
        }
    
        private final Stack<Memonte> STACK = new Stack<>();
    }
    

    黑箱模式备忘录

    // Originator对象,作为被备份的对象,同时需要负责创建备份和从备份恢复,
    // 黑箱模式:通过私有内部类,实现访问限制(只有Originator对象才可访问Memonte相关功能接口)
    public class Originator {
        private String state;
    
        public Originator(String state){ this.state = state;}
    
        public String getState() { return state;}
    
        public void setState(String state) { this.state = state;}
    
        public IMemonte createMonte(){ return new Memonte(this.state);}
    
        public void restoreMemonte(IMemonte memonte){ this.state = ((Memonte)memonte).getState();};
    
        public void show(){ System.out.println("State = " + this.state);}
    
        // 黑箱备忘录,private权限的Memonte对象,相应的接口仅在Originator类内部可用
        private class Memonte implements IMemonte{
            private String state;
    
            private Memonte(String state){ this.state = state;}
    
            private String getState() { return this.state;}
        }
    }
    
    // 空白接口,作为对外开放的数据接口,客户端只能持有和传递该对象,而无法对该对象只需如何操作
    public interface IMemonte {}
    
    // 备份管理器,存储所有的备份,可以有不同的数据结构实现。(栈式的后进先出,Map类型的备份点订点恢复,双指针数组实现固定大小备忘录)
    public class Caretaker {
        public IMemonte getMemonte() {
            return memonte;
        }
    
        public void setMemonte(IMemonte memonte) {
            this.memonte = memonte;
        }
    
        private IMemonte memonte;
    }
    

    Test

    public class Test {
        public static void main(String[] args) {
            Caretaker caretaker = new Caretaker();
            Originator originator = new Originator("Stop");         // 1. Stop
    
            // 首次备份
            caretaker.addMemonte(originator.createMonte(););
    
            // 更改状态后再次备份
            originator.setState("Start");                           // 2. Start
            caretaker.addMemonte(originator.createMonte());
    
            originator.setState("Run");                             // 3. Run
    
            // 恢复备份
            originator.restoreMemonte(caretaker.getMemonte());      // 4. Start
            originator.restoreMemonte(caretaker.getMemonte());      // 5. Stop
        }
    }
    

    双接口设计

    双接口设计 - 为一个类提供两个接口:

    • ①宽接口:具有所有的功能列表
    • ②窄接口:只有可对外可见的功能列表或者为空接口。
      双接口设计作用:宽接口对内提供所需的功能列表,窄接口对外使客户端对该对象的操作权限尽可能小

    欢迎疑问、期待评论、感谢指点 -- kiqi,愿同您为友

    -- 星河有灿灿,愿与之辉

  • 相关阅读:
    JDK源码之LinkedList
    MySQL常规知识点总结
    根据不同分辨率载入相应CSS样式表
    关于1.0.0版Backbone.js调用validate
    弹性盒模型计算
    使用CocoaPods
    Objective-C中的Block[转]
    将UTF8编码转化为中文 - NSString方法
    添加第三方类库造成的Undefined symbols for architecture i386:编译错误
    App适配iPhone 6/ Plus和iOS 8:10条小秘诀
  • 原文地址:https://www.cnblogs.com/kiqi/p/14070801.html
Copyright © 2011-2022 走看看