【Java设计模式】简单学备忘录模式——耍赖大法真滴香

目录

说明

实现方式

应用场景

其他链接


说明

  • 行为型模式之一,其他还有命令模式、模板方法模式、访问者模式、观察者模式、中介者模式、迭代器模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)
  • 备忘录模式( Memento Pattern )在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
  • 如果类的成员变量过多,势必会占用比 较大的资源,而且每一次保存都会消耗一定 的内存。因此为了节约内存,备忘录模式可以和原型模式配合使用

实现方式

《魔塔》这款游戏,很考究细心与策略。每一次加攻击、防御、生命都会影响到后面能不能打过boss。到最后如果打不过,肯定得重新来过,这时候就需要耍赖大法了(加属性前先存档,打不过再读档)。这就涉及到备忘录模式。

【Java设计模式】简单学备忘录模式——耍赖大法真滴香_第1张图片

 

public class MementoTest {
    public static void main(String[] args) {
        // 大战boss前
        GameRole superman = new GameRole();
        superman.initState();
        System.out.println(superman);

        // 保存进度(调用方不知道保存了具体什么数据)
        GameRoleStateCareTaker gameRoleStateCareTaker = new GameRoleStateCareTaker();
        gameRoleStateCareTaker.setGameRoleStateMemento(superman.saveState());

        // 大战boss
        superman.fight();
        System.out.println(superman);

        // 恢复备份,重新来过
        superman.recoveryState(gameRoleStateCareTaker.getGameRoleStateMemento());
        System.out.println(superman);
    }
}

/**
 * 游戏角色(发起人Originator类)
 * 

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ class GameRole { /** * 攻击力(需要保存的属性) */ private Integer attack; /** * 防御力 */ private Integer defense; /** * 生命值 */ private Integer health; /** * 保存状态(创建备忘录) *

* * @return GameRoleStateMemento * @author ZRH * @date 2020-07-23 * @version 1.0.0 */ public GameRoleStateMemento saveState() { return new GameRoleStateMemento(attack, defense, health); } public void initState() { this.attack = 100; this.defense = 100; this.health = 100; } public void fight() { this.health = 0; } /** * 显示数据 *

* * @return java.lang.String * @author ZRH * @date 2020-07-23 * @version 1.0.0 */ @Override public String toString() { return "游戏角色:【" + "攻击力=" + attack + ", 防御力=" + defense + ", 生命值=" + health + '】'; } /** * 恢复角色状态(恢复备忘录) *

* * @param gameRoleStateMemento * @author ZRH * @date 2020-07-23 * @version 1.0.0 */ public void recoveryState(GameRoleStateMemento gameRoleStateMemento) { this.attack = gameRoleStateMemento.getAttack(); this.defense = gameRoleStateMemento.getDefense(); this.health = gameRoleStateMemento.getHealth(); } public Integer getAttack() { return attack; } public void setAttack(Integer attack) { this.attack = attack; } public Integer getDefense() { return defense; } public void setDefense(Integer defense) { this.defense = defense; } public Integer getHealth() { return health; } public void setHealth(Integer health) { this.health = health; } } /** * 角色状态存储箱类(备忘录Memento类) *

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ class GameRoleStateMemento { /** * 攻击力 */ private Integer attack; /** * 防御力 */ private Integer defense; /** * 生命值 */ private Integer health; /** * 将相关数据导入 *

* * @author ZRH * @date 2020-07-23 * @version 1.0.0 */ public GameRoleStateMemento(Integer attack, Integer defense, Integer health) { this.attack = attack; this.defense = defense; this.health = health; } public Integer getAttack() { return attack; } public void setAttack(Integer attack) { this.attack = attack; } public Integer getDefense() { return defense; } public void setDefense(Integer defense) { this.defense = defense; } public Integer getHealth() { return health; } public void setHealth(Integer health) { this.health = health; } } /** * 角色状态管理者类(管理者类Caretaker) *

* * @author ZRH * @version 1.0.0 * @date 2020/7/23 */ class GameRoleStateCareTaker { private GameRoleStateMemento gameRoleStateMemento; public GameRoleStateMemento getGameRoleStateMemento() { return gameRoleStateMemento; } public void setGameRoleStateMemento(GameRoleStateMemento gameRoleStateMemento) { this.gameRoleStateMemento = gameRoleStateMemento; } }


应用场景

  • 打游戏时的存档
  • Windows 里的 ctrl + z
  • IE 中的后退
  • 数据库的事务管理

其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

【Java设计模式】其他模式~

你可能感兴趣的:(Java设计模式)