美文网首页
第5章 -行为型模式-备忘录模式

第5章 -行为型模式-备忘录模式

作者: 一介书生独醉江湖 | 来源:发表于2022-07-15 14:32 被阅读0次
    行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
    
    行为型模式共有11种:
    ■ 模板方法模式
    ■ 命令模式
    ■ 责任链模式
    ■ 策略模式
    ■ 迭代器模式
    ■ 中介者模式
    ■ 观察者模式
    ■ 备忘录模式
    ■ 访问者模式
    ■ 状态模式
    ■ 解释器模式
    
    一、备忘录模式的简介
    ■ 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态;
      这样,以后就可以将该对象恢复到原先保存的状态;
      通俗地说,备忘录模式就是将一个对象进行备份,提供一种程序数据的备份方法;
    
    image.png
    备忘录模式3个角色:
    ■ 发起人(Originator)角色:
      该角色记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘数据;
    ■ 备忘录(Memento)角色:
      该角色负责存储发起人角色的内部状态,在需要时提供发起人需要的内部状态数据;
    ■ 负责人(Caretaker)角色:
      该角色对备忘录角色进行管理、保存和提供备忘录;
    
    /**
     * 发起人角色
     */
    public class Originator {
    
        /**
         * 内部状态
         */
        private String state = "v1";
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    
        /**
         * 创建备忘录
         * @return
         */
        public Memento createMemento(){
            return new Memento(this.state);
        }
    
        /**
         * 恢复一个备忘录
         * @param memento
         */
        public void restoreMemento(Memento memento){
            this.setState(memento.getState());
        }
    }
    
    /**
     * 负责人角色
     */
    public class Caretaker {
    
        /**
         * 备忘录对象
         */
        private Memento memento;
    
        public Memento getMemento() {
            return memento;
        }
    
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }
    
    /**
     * 备忘录角色
     */
    public class Memento {
    
        /**
         * 发起人的内部状态
         */
        private String state;
    
        public Memento(String state) {
            this.state = state;
        }
    
        public String getState() {
            return state;
        }
    
        public void setState(String state) {
            this.state = state;
        }
    }
    
    /**
     * 应用代码
     */
    public class Client {
    
        public static void main(String[] args){
            /**
             * 定义一个发起人
             */
            Originator originator = new Originator();
            /**
             * 定义一个负责人
             */
            Caretaker caretaker = new Caretaker();
            /**
             * 创建一个备忘录
             */
            caretaker.setMemento(originator.createMemento());
            System.out.println("创建一个备忘录 state : " + caretaker.getMemento().getState());
    
            /**
             * 恢复一个备忘录
             */
            originator.restoreMemento(caretaker.getMemento());
            System.out.println("恢复一个备忘录 state : " + originator.getState());
        }
    }
    
    # 控制台输出:
    创建一个备忘录 state : v1
    恢复一个备忘录 state : v1
    
    备忘录模式的应用:
    ■ 需要保存和恢复数据的相关状态场景;
    ■ 提供一个可回滚的操作;
    ■ 需要监控副本的场景;
    ■ 数据库连接的事务管理使用的就是备忘录模式;
    
    二、备忘录模式的实例
    # 使用备忘录模式模拟版本控制系统的工作过程;
    
    image.png
    /**
     * 需要被纳入版本控制系统的文档
     */
    public class Document {
    
        /**
         * 需要备份的状态
         */
        String content;
    
        /**
         * 不需要备份的状态
         */
        String otherContent;
    
        /**
         * 保存一个备份
         * @return
         */
        public Backup save(){
            System.out.println("保存备份");
            return new Backup(content);
        }
    
        /**
         * 恢复为某个状态
         * @param backup
         */
        public void resume(Backup backup){
            System.out.println("恢复备份");
            content = backup.content;
        }
    
        @Override
        public String toString() {
            return "Document{" +
                    "content='" + content + '\'' +
                    ", otherContent='" + otherContent + '\'' +
                    '}';
        }
    }
    
    /**
     * 版本控制系统中保存的每一个备份
     */
    public class Backup {
    
        /**
         * 备份的内容
         */
        String content;
    
        /**
         * 版本
         */
        int version;
    
        public Backup(String content) {
            this.content = content;
        }
    }
    
    import java.util.LinkedList;
    
    /**
     * 版本控制系统
     */
    public class VersionControlSystem {
    
        /**
         * 所有的备份
         */
        LinkedList<Backup> backups = new LinkedList<>();
    
        /**
         * 下一个版本
         */
        int nextVersion;
    
        /**
         * 添加备份
         * @param backup
         */
        public void add(Backup backup){
            backup.version = ++nextVersion;
            backups.add(backup);
        }
    
        /**
         * 取得某个版本的备份
         * @param version
         * @return
         */
        public Backup get(int version){
            for(Backup backup : backups){
                if(backup.version == version){
                    return backup;
                }
            }
            return null;
        }
    
        /**
         * 取得最后一个版本的备份
         * @return
         */
        public Backup getLastVersion(){
            return backups.getLast();
        }
    }
    
    /**
     * 测试类
     */
    public class Test {
    
        public static void main(String[] args){
            VersionControlSystem vcs = new VersionControlSystem();
            Document document = new Document();
    
            System.out.println("******************");
            /**
             * 保存备份
             */
            document.content = "content1";
            document.otherContent = "otherContent1";
            System.out.println(document);
            vcs.add(document.save());
    
            System.out.println("******************");
            /**
             * 保存备份
             */
            document.content = "content2";
            document.otherContent = "otherContent2";
            System.out.println(document);
            vcs.add(document.save());
    
            System.out.println("******************");
            /**
             * 保存备份
             */
            document.content = "content3";
            document.otherContent = "otherContent3";
            System.out.println(document);
            vcs.add(document.save());
    
            System.out.println("******************");
    
            /**
             * 恢复版本1
             */
    
            document.resume(vcs.get(1));
            System.out.println(document);
    
            System.out.println("******************");
    
            /**
             * 恢复到最新版本
             */
    
            document.resume(vcs.getLastVersion());
            System.out.println(document);
    
            System.out.println("******************");
        }
    }
    
    # 控制台输出:
    ******************
    Document{content='content1', otherContent='otherContent1'}
    保存备份
    ******************
    Document{content='content2', otherContent='otherContent2'}
    保存备份
    ******************
    Document{content='content3', otherContent='otherContent3'}
    保存备份
    ******************
    恢复备份
    Document{content='content1', otherContent='otherContent3'}
    ******************
    恢复备份
    Document{content='content3', otherContent='otherContent3'}
    ******************
    
    参考:
    摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
    

    相关文章

      网友评论

          本文标题:第5章 -行为型模式-备忘录模式

          本文链接:https://www.haomeiwen.com/subject/epiqirtx.html