• 【行为型模式】备忘录模式


    一、备忘录模式概述

            备忘录模式定义又称之为快照模式(Snapshop Pattern)或者令牌模式(Token Pattern),是指在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样我们就可以在需要的时候将该对象恢复到原先保存的状态了。(对象行为型)

    备忘录模式有两个目标:

    • 储存系统关键对象的重要状态;
    • 维护关键对象的封装。

    • 备忘录模式的优缺点
      • 优点
        • 1.将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚;
        • 2.提供了容易实现的恢复能力;
        • 3.保持关键对象的数据封装。
      • 缺点:
        • 储存和恢复状态的过程可能相当耗时。
    • 适用环境
      • 1.需要保存历史快照的场景;
      • 2.希望在对象之外保存状态,且除了自己其他对象无法访问状态的具体保存内容。

    二、代码实现

            备忘录模式主要有3个角色:

    • 发起人(Originator)角色:负责创建一个备忘录,记录自身需要保存的状态,而且需要具备状态的回滚功能。
    • 备忘录(Memento)角色:用于存储Originator角色的内部状态,且可以防止Originator以外的对象进行访问。
    • 备忘录管理员(Caretaker)角色:负责存储,管理备忘录功能。且其本身应该无法对备忘录的内容进行访问。
            2.1 Originator
    1. package Memento.example;
    2. //发起人角色
    3. public class Originator {
    4. private String state;
    5. public void setState(String state) {
    6. this.state = state;
    7. }
    8. public String getState() {
    9. return state;
    10. }
    11. public Memento saveStateToMemento() {
    12. return new Memento(state);
    13. }
    14. public void getStateFromMemento(Memento Memento) {
    15. state = Memento.getState();
    16. }
    17. }
            2.2 Memento
    1. package Memento.example;
    2. //备忘录角色
    3. public class Memento {
    4. private String state;
    5. public Memento(String state) {
    6. this.state = state;
    7. }
    8. public String getState() {
    9. return state;
    10. }
    11. }
            2.3 Caretaker
    1. package Memento.example;
    2. //备忘录管理员
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. public class CareTaker {
    6. private List mementoList = new ArrayList();
    7. public void add(Memento state){
    8. mementoList.add(state);
    9. }
    10. public Memento get(int index){
    11. return mementoList.get(index);
    12. }
    13. }
            2.4 客户端
    1. package Memento.example;
    2. public class Client {
    3. public static void main(String[] args) {
    4. // TODO Auto-generated method stub
    5. Originator originator = new Originator();
    6. CareTaker careTaker = new CareTaker();
    7. originator.setState("State #1");
    8. originator.setState("State #2");
    9. careTaker.add(originator.saveStateToMemento());
    10. originator.setState("State #3");
    11. careTaker.add(originator.saveStateToMemento());
    12. originator.setState("State #4");
    13. System.out.println("Current State: " + originator.getState());
    14. originator.getStateFromMemento(careTaker.get(0));
    15. System.out.println("First saved State: " + originator.getState());
    16. originator.getStateFromMemento(careTaker.get(1));
    17. System.out.println("Second saved State: " + originator.getState());
    18. }
    19. }
            2.5 UML图

    三、代码结构图

  • 相关阅读:
    Web前端大作业、基于HTML+CSS+JavaScript响应式个人相册博客网站
    [学习笔记]python绘制图中图(绘制站点分布图)
    云原生之 Gateway 的 Filter 过滤器
    操作系统原理实验四:管道通信、消息通信程序
    nginx-location和proxy_pass的url拼接
    《HTML+CSS+JavaScript》之第7章 图片
    【计算机网络】IP协议分析
    【微信小程序】三分钟学会小程序的列表渲染
    c++单例模式线程安全几种实现方式
    P1068 [NOIP2009 普及组] 分数线划定
  • 原文地址:https://blog.csdn.net/qq_45276194/article/details/138123000