备忘录模式19

一、定义

        定义:记录一个关键对象的关键属性,当关键属性发生变化的时或者出错时,有办法将对象恢复到以前的状态。

        

        角色:

        发起人Originator:这个角色是需要被记录的关键对象。一般来说,它有几个比较关键的属性需要被记录。

        备忘录Memento:发起人将自己的关键属性保存到备忘录对象中。当发起人需要恢复的关键属性的时候,拿出这个备忘录即可。

        管理角色Caretaker:用于保存备忘录的地方。当发起人需要恢复的时候,从管理角色中拿出某个版本的备忘录。这点非常像Git版本控制。

        推荐文章:

        Java设计模式20-备忘录模式

        23种设计模式(15):备忘录模式


二、优缺点


        优点:当关键对象的关键属性变化并且出错时,我们可以使用备忘录模式将对象还原。

        缺点:如果要记录多个版本的关键对象,那么要创建多个版本的备忘录对象。那么对资源的消耗还是比较大的。


三、心法


        实际应用:数据库事务回滚。

        使用场景:当一个对象需要记录其历史属性,并且需要记录的属性是所有属性的一部分时,可以使用备忘录模式记录属性。

        怎么才能知道这个对象的关键属性变化了呢?利用观察者模式进行控制,当对关键对象的关键属性进行修改的时候,关键对象创建备忘录,让相关对象来记录此备忘录。


四、简单例子代码

        
/**
 * Created by Administrator on 2018/5/30.
 */
//发起者类
public class Originator {
    private String key;//关键属性

    /**
     * 创建备忘录
     * @return 备忘录对象
     */
    public MemontoIF createMemoto(){
        return new Memonto(this.key);
    }

    /**
     * 恢复状态
     */
    public void recover(MemontoIF memontoIF){
        Memonto memonto = (Memonto)memontoIF;
        this.setKey(memonto.getKey());
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    @Override
    public String toString() {
        return "Originator{" +
                "key='" + key + '\'' +
                '}';
    }

    /**
     * 备忘录类,是发起者类的内部类,实现标记接口,对外不开放。
     * 客户端只能拿到此标记接口的实现类
     */
    private class Memonto implements MemontoIF{
        //记录发起者类的关键属性
        private String key;
        public Memonto(String key) {
            this.key = key;
        }

        public String getKey() {
            return key;
        }

        public void setKey(String key) {
            this.key = key;
        }
    }

    /**
     * 客户端调用环境
     */
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setKey("key1");
        System.out.println(originator);

        //上一次的状态
        MemontoIF memontoIF = originator.createMemoto();

        originator.setKey("key2");
        System.out.println(originator);

        //恢复
        originator.recover(memontoIF);
        System.out.println(originator);

        /**
         * 运行结果:
         * Originator{key='key1'}
         * Originator{key='key2'}
         * Originator{key='key1'}
         */

    }
}

//标记接口
interface MemontoIF{
}

分割线--------------------------------------------------------------------------------------------

下一篇:状态设计模式20


猜你喜欢

转载自blog.csdn.net/yanluandai1985/article/details/80508453