• 备忘录模式——HeadFirst设计模式学习笔记


    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。可以将该对象恢复到原先保存的状态

    Java中可以使用序列化机制保存状态

    • 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
    • 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
    • 管理角色:对备忘录进行管理,保存和提供备忘录。

    特点:

    • 被存储的状态放在外面,不和关键对象放在一起
    • 保持了关键对象的封装,提供实现恢复的能力

    缺点:

    • 资源与时间的消耗

    举例:

    通过备忘录管理游戏角色信息

     游戏角色类:

     1 public class PlayRole {
     2     private int vitality;
     3     private int aggressivity;
     4     private int defencivity;
     5     public PlayRole(int vitality, int aggressivity, int defencivity) {
     6         super();
     7         this.vitality = vitality;
     8         this.aggressivity = aggressivity;
     9         this.defencivity = defencivity;
    10     }
    11     public PlayRole() {}
    12     public RoleMemento createMemento() {
    13         RoleMemento memento = new RoleMemento();
    14         memento.setAggressivity(aggressivity);
    15         memento.setDefencivity(defencivity);
    16         memento.setVitality(vitality);
    17         return memento;
    18     }
    19     public void setMemento(RoleMemento memento) {
    20         this.aggressivity = memento.getAggressivity();
    21         this.defencivity = memento.getDefencivity();
    22         this.vitality = memento.getVitality();
    23     }
    24     public void showState() {
    25         System.out.println("攻击力:" + this.aggressivity + "|防御力:" + this.defencivity + "|生命力:" + this.vitality);
    26     }
    27 ...//其他
    28 }

    备忘录类:

     1 public class RoleMemento {
     2     private int vitality;
     3     private int aggressivity;
     4     private int defencivity;
     5     public int getVitality() {
     6         return vitality;
     7     }
     8     public void setVitality(int vitality) {
     9         this.vitality = vitality;
    10     }
    11     public int getAggressivity() {
    12         return aggressivity;
    13     }
    14     public void setAggressivity(int aggressivity) {
    15         this.aggressivity = aggressivity;
    16     }
    17     public int getDefencivity() {
    18         return defencivity;
    19     }
    20     public void setDefencivity(int defencivity) {
    21         this.defencivity = defencivity;
    22     }
    23 }        

    备忘录管理者,通过HashMap管理一个用户多个历史状态:

    1 public class Caretaker {
    2     Map<String, RoleMemento> mementoMap = new HashMap<>();
    3     public RoleMemento getMemento(String index) {
    4         return mementoMap.get(index);
    5     }
    6     public void setMemento(String index, RoleMemento memento) {
    7         mementoMap.put(index, memento);
    8     }
    9 }
  • 相关阅读:
    grep在指定类型的文件中查找字符 (转载)
    关于 android 中 postDelayed方法的讲解 (转载)
    linux下sprintf_s函数的替代(转载)
    两分钟彻底让你明白Android Activity生命周期(图文)!(转载)
    linux C之access函数(转载)
    Android.mk中call all-subdir-makefiles和call all-makefiles-under,$(LOCAL_PATH)的区别(转载)
    adb logcat 查看日志 (转载)
    Android 实用技巧 --- 命令godir (转载)
    emacs版本差异(转载)
    vim的visual可视模式(转载)
  • 原文地址:https://www.cnblogs.com/HectorHou/p/6041048.html
Copyright © 2020-2023  润新知