美文网首页
第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