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

原文地址:https://www.cnblogs.com/anni-qianqian/p/8444083.html

时间: 2024-11-06 17:30:59

《设计模式之禅》--备忘录扩展:clone方式的备忘录的相关文章

《设计模式之禅》--代理扩展:动态代理

接上篇<设计模式之禅>--代理扩展:强制代理 动态代理就是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象.相对来说,自己写代理类的方式就是静态代理 面向切面编程(AOP)核心就是采用了动态代理机制 public interface Subject { //业务操作 public void doSomething(String str); } public class RealSubject implements Subject { //业务操作 public void doSome

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

接上篇<设计模式之禅>--代理扩展:动态代理 需求:加减法计算 public enum Calculator { //加法运算 ADD("+") { public int exec(int a, int b) { return a + b; } }, //减法运算 SUB("-") { public int exec(int a, int b) { return a - b; } }; String value = ""; //定义成

【设计模式之禅 第2版】读书笔记

自己练习的源码地址:https://git.oschina.net/snnhoo/DesignPattern.git  欢迎推送 第一章 单一职责原则 简称SRP:Single Responsibility Principle 定义:应该有且仅有一个原因引起类的变更 好处: 类复杂度降低,职责明确 可读性高 可维护性高 变更引起风险低 接口设计要单一,实现要根据情况,方法也适用单一职责 第二章 里氏替换原则 定义:父类能出现的地方就能用子类,且不会产生任何异常,但是反过来则不行,有子类出现的地方

设计模式之禅笔记下部

这是我看的第一本设计模式,由于觉得个人代码量不多,一直没有看,现在也只是了解为主,平时稍加注意,过一两年再详细研究.由于本人粗心大意,写在word里没有保存我就重装系统...这里只记下了下半部分. <设计模式之禅>这本书,讲的还是比较浅显易懂,这种java这种强类型语言,讲究封装和继承,用于讲解设计模式再合适不过了.例子引入对于初学者而言还是挺不错的,可惜后文讲解有点流于表面了.下面我就贴出笔记. 笔记 #装饰模式(Decorator Pattern) 动态的给一个对象添加职责,就增加功能来说

设计模式之禅之单例模式

转载:http://www.javaweb1024.com/java/Javajichu/2015/04/09/535.html 设计模式之禅 第一第二版下载地址 http://www.javaweb1024.com/info/403.jspx 第7章 单例模式 7.1 我是皇帝我独苗 自从秦始皇确立了皇帝这个位置以后,同一时期基本上就只有一个人孤零零地坐在这个位置.这种情况下臣民们也好处理,大家叩拜.谈论的时候只要提及皇帝,每个人都知道指的是谁,而不用在皇帝前面加上特定的称呼,如张皇帝.李皇帝

读秦小波《设计模式之禅》 -- 工厂模式

设计模式是一种非常有用的编程技巧,它对于代码的重构有些非常重要的作用,对于软件开发人员来说,需要理解并尝试着使用这些设计的方法. 个人感觉<设计模式之禅>这本书中讲解的非常具体,每个模式都配以适当的例子,非常适合学习设计模式的初学者,当然,程杰的<大话设计模式>也是非常好的一本书,都可以拿过来当做一本工具书随时查看理解设计的奥妙. 工厂模式 这个模式的名字就已经告诉了我们它想要做什么,就是让我们构造出一个工厂,然后生产我们需要的东西,即生成对象.那么,为什么要构造一个工厂呢,为什么

设计对象的一些基本原则(学习自设计模式之禅)

1.单一职责原则(srp):就是设计一个对象,对象的职责要单一. 比如设计用户类,将用户的行为和用户的属性分成两个接口,继承的方式设计类. 还有一个srp的解释是:there is no more than one reason for a class to change 但srp的原则有可能把握的过细,导致类太散.所以也不可以走极端. 2.里式替换原则:代码中使用父类的地方都可以用他的子类来代替. 个人理解,子类里有全部的父类的方法(继承来的或者重载过了),若重载了方法,实现的逻辑肯定和父类不

读秦小波老师《设计模式之禅》问一-依赖倒置原则

这本<设计模式之禅>得来不易,当时是在CSDN的论坛中向秦小波老师提问有幸获得的.读这种经典书籍不能如读小说,逛十里洋场意在消遣,更多的应该是边读变问,每到重点就应该问为什么.秦小波老师的语言有时幽默,有时又切中要害,引人深思.对于"倒置"秦小波老师是从人的思维层面解读的,生活中,例如张三就依赖他家的宝马上下班,也许可以更具体到BMW 740Li,然后回归到程序中,如果我们这样去构建依赖关系,那么如果哪天张三发达了,换了玛莎拉蒂,那是不是整个程序都得改,这个时候我们可以让张

101JAVA设计模式--业务逻辑实现扩展,框架使用分析总结

23中设计模式目录如下: 工厂模式抽象工厂模式单例模式建造者模式原型模式适配器模式桥接模式过滤器模式组合模式装饰器模式外观模式享元模式代理模式责任链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式空对象模式策略模式模板模式访问者模式 1.哪些JAVA不能用?3种 内存相关的:克隆模式,享元模式,备忘录模式. 特殊的:解释器模式,空对象模式. 2.哪些JAVA已经支持?3种 代理模式:JDK自动的动态代理:CGLIB,接口代理 观察者模式:JAVAEE中的拦截器,过滤器,Sp