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 }
  • 相关阅读:
    计算机基础知识
    markdown简介及基本语法
    session和cookie的区别
    MySQL的游标
    数据库单表查询
    外键(有无级联)
    mysql
    数据库引擎
    守护进程和守护线程的区别
    快排等
  • 原文地址:https://www.cnblogs.com/HectorHou/p/6041048.html
Copyright © 2011-2022 走看看