zoukankan      html  css  js  c++  java
  • 《设计模式之禅》--备忘录扩展:clone方式的备忘录

    接上篇《设计模式之禅》--策略扩展:策略枚举

    需求:使用clone方式实现备忘录模式

    发起人角色

    public class Originator implements Cloneable {
        //内部状态
        private String state = "";
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        //创建一个备忘录
        public Originator createMemento() {
            return this.clone();
        }
    
        //恢复一个备忘录
        public void restoreMemento(Originator _originator) {
            this.setState(_originator.getState());
        }
    
        //克隆当前对象
        @Override
        protected Originator clone() {
            try {
                return (Originator) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    备忘录管理员角色

    public class Caretaker {
        //发起人对象
        private Originator originator;
    
        public Originator getOriginator() {
            return originator;
        }
    
        public void setOriginator(Originator originator) {
            this.originator = originator;
        }
    }

    上面两项合并

    public class Originator implements Cloneable {
        private Originator backup;
        //内部状态
        private String state = "";
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        //创建一个备忘录
        public void createMemento() {
            this.backup = this.clone();
        }
    
        //恢复一个备忘录
        public void restoreMemento() {
            //在进行恢复前应该进行断言,防止空指针
            this.setState(this.backup.getState());
        }
    
        //克隆当前对象
        @Override
        protected Originator clone() {
            try {
                return (Originator) super.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    调用

    public class Client {
        public static void main(String[] args) {
            //定义发起人
            Originator originator = new Originator();
            //建立初始状态
            originator.setState("初始状态...");
            System.out.println("初始状态是:" + originator.getState());
            //建立备份
            originator.createMemento();
            //修改状态
            originator.setState("修改后的状态...");
            System.out.println("修改后状态是:" + originator.getState());
            //恢复原有状态
            originator.restoreMemento();
            System.out.println("恢复后状态是:" + originator.getState());
        }
    }

    结果

    初始状态是:初始状态...
    修改后状态是:修改后的状态...
    恢复后状态是:初始状态

    注意:

    使用Clone方式的备忘录模式,可以使用在比较简单的场景或者比较单一的场景中,尽量不要与其他的对象产生严重的耦合关系。

  • 相关阅读:
    nginx-dockerfile
    redis-dockerfile
    php-dockerfile
    redis配置优化
    linux 相关命令
    redis服务器主机建议修改配置
    redis主从连接不成功错误
    数据库设计 读多写少、写多读少、写多读多各场景数据库建设方案
    查看容器IP和端口
    JavaScript基础知识六(内存释放、作用域销毁)
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8444083.html
Copyright © 2011-2022 走看看