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

  • 相关阅读:
    element:记一次重置表单引发提交数据为默认数据现象
    三种常用又简单的排序算法
    (07)GitHub从2021.08.13开始使用Token代替账号和密码
    does not implement methodSignatureForSelector:
    自用python库
    2048
    CCSP2021游记
    2021 CCPC 桂林站游记
    2021 ICPC 沈阳站游记
    2021SDU新生赛游记
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8444083.html
Copyright © 2011-2022 走看看