zoukankan      html  css  js  c++  java
  • 备忘录模式——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 }
  • 相关阅读:
    547. Friend Circles
    399. Evaluate Division
    684. Redundant Connection
    327. Count of Range Sum
    LeetCode 130 被围绕的区域
    LeetCode 696 计数二进制子串
    LeetCode 116 填充每个节点的下一个右侧节点
    LeetCode 101 对称二叉树
    LeetCode 111 二叉树最小深度
    LeetCode 59 螺旋矩阵II
  • 原文地址:https://www.cnblogs.com/HectorHou/p/6041048.html
Copyright © 2011-2022 走看看