zoukankan      html  css  js  c++  java
  • 【设计模式】备忘录模式

    一、定义

      备忘录(Memento)模式的定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

    二、结构

    备忘录模式的结构

    备忘录模式的主要角色如下。 

      1)发起人(Originator)角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。

      2)备忘录(Memento)角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。

      3)管理者(Caretaker)角色:对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。

    结构图

        

    三、代码实现

     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         Originator originator = new Originator();
     5         Caretaker caretaker = new Caretaker();
     6         // 状态1
     7         originator.setState("状态1");
     8         System.out.println("初始状态:" + originator.getState());
     9         caretaker.saveMemento(originator.createMemento());
    10         // 状态2
    11         originator.setState("状态2");
    12         System.out.println("新的状态:" + originator.getState());
    13         // 恢复状态
    14         originator.restoreMemento(caretaker.getLastMemento());
    15         System.out.println("恢复状态:" + originator.getState());
    16     }
    17 }
    18 
    19 // 备忘录
    20 class Memento {
    21     private String state;
    22 
    23     public Memento(String state) {
    24         this.state = state;
    25     }
    26 
    27     public String getState() {
    28         return state;
    29     }
    30 
    31     public void setState(String state) {
    32         this.state = state;
    33     }
    34 }
    35 
    36 // 发起人
    37 class Originator {
    38     private String state;
    39 
    40     public Memento createMemento() {
    41         return new Memento(state);
    42     }
    43 
    44     public void restoreMemento(Memento m) {
    45         this.setState(m.getState());
    46     }
    47 
    48     public String getState() {
    49         return state;
    50     }
    51 
    52     public void setState(String state) {
    53         this.state = state;
    54     }
    55 }
    56 
    57 // 管理者
    58 class Caretaker {
    59     private List<Memento> mementos = new ArrayList<>();
    60 
    61     public Memento getLastMemento() {
    62         return mementos.get(mementos.size() - 1);
    63     }
    64 
    65     public void saveMemento(Memento memento) {
    66         mementos.add(memento);
    67     }
    68 }
  • 相关阅读:
    java自带线程池
    SQL 语句学习
    Eclipse 运行内存不足情况
    Eclipse的ant调用maven
    Elipse 无法启动问题(转)
    UI自动化测试实战之Select类实战(四)
    WebElement类方法实战(三)
    WebDriver浏览器属性详解(二)
    服务端测试之gRPC协议测试(一)
    服务端测试实战(一)
  • 原文地址:https://www.cnblogs.com/h--d/p/14713937.html
Copyright © 2011-2022 走看看