java设计模式---备忘录模式

备忘录模式是一种设计模式,用于在不破坏封装性的情况下,捕获对象的内部状态,并允许对象恢复到之前保存的状态。 Originator(原发器)创建并保存Memento(备忘录),Caretaker(管理者)负责存储备忘录而不访问其内容。该模式简化了发起者类,允许在状态无效时回滚。然而,若状态复杂,备忘录对象可能消耗大量资源。测试案例展示了如何使用备忘录模式来保存和恢复发电机的工作状态。
摘要由CSDN通过智能技术生成

备忘录模式

  • 概述:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样可以将对象恢复到原先保存的状态.

  • 帮助理解:备忘录模式就是为对象提供一个备份的地方,当对象想要回滚到前一个状态时,调用备忘录对象直接就可以恢复.

  • 备忘录模式说包含的角色

    • Originator : 原发器,也就是发起者.记录有当前时刻自身的内部状态,负责创建一个备忘录Memento,用于记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态.Originator可以根据需要决定Memento存储自己的哪些内部状态(发起者可能有很多内部状态,可以决定哪些由备忘录备份)

    • Memento : 备忘录.负责存储Originator对象的内部状态,并可以防止Originator之外的其它对象访问备忘录.备忘录有两个接口.Caretaker只能看到备忘录的窄接口,他只能将备忘录对象传递给其它对象.Originator却能够看到备忘录的宽接口.允许它访问返回到先前状态所需要的所有数据.

    • Caretaker : 管理者.负责保存备忘录.但是不能对备忘录的内容进行操作和访问.只能够将备忘录传递给其它对象.

  • 优点

    • 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须由发起人对象自己读取.这时使用备忘录模式可以将复杂的发起人内部信息对其它对象屏蔽起来.从而可以恰当的保持封装的边界.

    • 备忘录模式简化了发起者类.发起者不再需要管理和保存其内部状态的一个个版本.客户端可以自行管理他们所需要的这些状态的版本.

    • 当发起者角色的状态发生改变的时候.有可能这个状态无效,需要回滚到前一个状态.这时候可以使用暂时存储起来的备忘录将状态进行还原.

  • 缺点

    • 如果发起者角色的状态有很多并且需要完整的储存到备忘录对象中.那么备忘录对象会很消耗资源.

  • 注意事项

    • 备忘录模式最理想的情况是只允许生成该备忘录的那个原发器能够访问这个备忘录的内部状态.

/**
 * 〈备忘录对象类〉
 *
 * @author vegetate
 * @create 2018/11/12 17:08
 */
public class MemoBean {
    private int useTime;//使用时间
    private String deviceName;//设备名称
    private int stateLevel;//状态
    public int getUseTime() {
        return useTime;
    }
    public void setUseTime(int useTime) {
        this.useTime = useTime;
    }
    public String getDeviceName() {
        return deviceName;
    }
    public void setDeviceName(String deviceName) {
        this.deviceName = deviceName;
    }
    public int getStateLevel() {
        return stateLevel;
    }
    public void setStateLevel(int stateLevel) {
        this.stateLevel = stateLevel;
    }

}
/**
 * 〈备忘录管理对象〉
 *
 * @author vegetate
 * @create 2018/11/12 17:11
 */
public class MemoManager {
    MemoBean memento;

    public MemoBean getMemento() {
        return memento;
    }

    public void setMemento(MemoBean memento) {
        this.memento = memento;
    }
}
/**
 * 〈发起者对象〉
 *
 * @author vegetate
 * @create 2018/11/12 17:13
 */
public class MemoRole {
    private int useTime;// 使用时间
    private String deviceName;// 设备名称
    private int stateLevel;// 状态

    public MemoRole(String deviceName, int useTime, int stateLevel) {
        super();
        this.useTime = useTime;
        this.deviceName = deviceName;
        this.stateLevel = stateLevel;
    }

    public MemoRole() {
    }

    public int getUseTime() {
        return useTime;
    }

    public void setUseTime(int useTime) {
        this.useTime = useTime;
    }

    public String getDeviceName() {
        return deviceName;
    }

    public void setDeviceName(String deviceName) {
        this.deviceName = deviceName;
    }

    public int getStateLevel() {
        return stateLevel;
    }

    public void setStateLevel(int stateLevel) {
        this.stateLevel = stateLevel;
    }

    public MemoBean createMemoObject() {
        MemoBean memento = new MemoBean();
        memento.setDeviceName(deviceName);
        memento.setStateLevel(stateLevel);
        memento.setUseTime(useTime);
        return memento;
    }

    public void setMemento(MemoBean memento) {
        this.deviceName = memento.getDeviceName();
        this.stateLevel = memento.getStateLevel();
        this.useTime = memento.getUseTime();
    }

    /**
     * 获取对象当前状态
     */
    public void getCurrentState() {
        System.out.println("当前设备名称:" + this.deviceName + "当前使用时间:" + this.useTime + "当前工作状态:" + this.stateLevel);
    }
}

测试类

/**
 * 〈测试类〉
 *
 * @author vegetate
 * @create 2018/11/12 17:14
 */
public class Test {

    public static void main(String[] args) {
        // 新建备忘录发起者对象
        MemoRole role = new MemoRole("发电机", 0, 1);
        // 新建备忘录管理者
        MemoManager manager = new MemoManager();
        // 角色初始状态
        System.out.println("机器开始发电:");
        role.getCurrentState();
        // 利用备忘录模式保存当前状态
        System.out.println("---保存当前的机器状态---");
        manager.setMemento(role.createMemoObject());
        role.setDeviceName("发电机");
        role.setStateLevel(5);
        role.setUseTime(1000);
        System.out.println("已经持续发电1000小时");
        role.getCurrentState();
        // 恢复保存的角色状态
        role.setMemento(manager.getMemento());
        System.out.println("恢复后发电机当前状态:");
        role.getCurrentState();
    }

}

结果: 
机器开始发电: 
当前设备名称:发电机当前使用时间:0 当前工作状态:1 
—保存当前的机器状态— 
已经持续发电N小时 
当前设备名称:发电机当前使用时间:1000 当前工作状态:5 
恢复后发电机当前状态: 
当前设备名称:发电机当前使用时间:0 当前工作状态1 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优雅的心情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值