JAVA设计模式之(十九)备忘录模式

    xiaoxiao2025-01-12  21

    本文继续介绍23种设计模式系列之备忘录模式。

    备忘录模式

    备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。一听到备忘录这个字的时候想起了小小时打的游戏,每次遇到大boss的时候都会保存一下进度,打过了就不需要恢复记录,打不过肯定就复原到刚刚保存的记录咯,重新打一遍BOSS,打死为止。哈哈,这就是备忘录模式,虽然很多模式都只是学到基础,但是发现越来越接近生活了。

    涉及角色:   Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。   Memento(备忘录):负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。   Caretaker(管理者) : 负责备忘录Memento,不能对Memento的内容进行访问或者操作。

    备忘录模式UML图

    备忘录模式代码

    package com.test.mementoPattern; /** * 游戏角色 * @author riemann * @date 2019/05/26 14:04 */ public class GameRole { private int physicalStrength; private int damage; public void init() { physicalStrength = 100; damage = 100; } public void show() { System.out.println("体力: " + physicalStrength); System.out.println("攻击力: " + damage); } public void fightBoss() { this.physicalStrength = 0; this.damage = 0; } public RoleStateMemento saveMemento() { return (new RoleStateMemento(physicalStrength, damage)); } public void remove(RoleStateMemento roleStateMemento) { this.physicalStrength = roleStateMemento.getPhphysicalStrength(); this.damage = roleStateMemento.getDamage(); } public int getPhysicalStrength() { return physicalStrength; } public void setPhysicalStrength(int physicalStrength) { this.physicalStrength = physicalStrength; } } package com.test.mementoPattern; /** * 游戏角色管理类 * @author riemann * @date 2019/05/26 14:13 */ public class RoleStateManage { private RoleStateMemento memento; public RoleStateMemento getMemento() { return memento; } public void setMemento(RoleStateMemento memento) { this.memento = memento; } } package com.test.mementoPattern; /** * 存储类 * @author riemann * @date 2019/05/26 14:14 */ public class RoleStateMemento { private int phphysicalStrength; private int damage; public RoleStateMemento(int phphysicalStrength, int damage) { this.phphysicalStrength = phphysicalStrength; this.damage = damage; } public int getPhphysicalStrength() { return phphysicalStrength; } public void setPhphysicalStrength(int phphysicalStrength) { this.phphysicalStrength = phphysicalStrength; } public int getDamage() { return damage; } public void setDamage(int damage) { this.damage = damage; } } package com.test.mementoPattern; /** * @author riemann * @date 2019/05/26 14:20 */ public class Client { public static void main(String[] args) { GameRole riemann = new GameRole(); riemann.init(); riemann.show(); RoleStateManage roleStateManage = new RoleStateManage(); roleStateManage.setMemento(riemann.saveMemento());//保存 riemann.fightBoss(); riemann.show(); riemann.remove(roleStateManage.getMemento()); riemann.show(); } }

    运行结果:

    使用备忘录的原因

    想要恢复对象某时的原有状态。

    优点

    它提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原。备忘录实现了对信息的封装,一个备忘录对象是一种原发器对象状态的表示,不会被其他代码所改动。备忘录保存了原发器的状态,采用列表、堆栈等集合来存储备忘录对象可以实现多次撤销操作。

    缺点

    资源消耗过大,如果需要保存的原发器类的成员变量太多,就不可避免需要占用大量的存储空间,每保存一次对象的状态都需要消耗一定的系统资源。

    备忘录模式适用场景

    保存一个对象在某一个时刻的全部状态或部分状态,这样以后需要时它能够恢复到先前的状态,实现撤销操作。防止外界对象破坏一个对象历史状态的封装性,避免将对象历史状态的实现细节暴露给外界对象。
    最新回复(0)