简说备忘录模式

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

设计模式之备忘录模式

定义

备忘录模式是一种软件设计模式:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 —— [ 百度百科 ]

解释说明

在备忘录模式中,发起人就是备忘录的创建者使用者,备忘录用于存贮发起人的状态,管理者则负责对备忘录实例进行维护(存储于提取)。发起人首先创建当前状态的备忘录,然后将备忘录实例交由管理者存储,当发起人需要返回到之前的状态的时候,则从管理者那里取回备忘录实例,并获取备忘录中信息进行恢复。

代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Test {
    //备忘录
    class Memento {
        public Memento(String clothes){
            this.clothes = clothes;
        }       
        public String getClothes() {
            return clothes;
        }
        private String clothes = "";
    }
    //发起人
    class Man{
        public void say() {
            System.out.println("今天穿的是" + this.clothes); 
        }
        public void setClothes(String clothes) {
            this.clothes = clothes;
        }
        public Memento createMemento(){
            return new Memento(this.clothes);
        }
 
        private String clothes = "红衣服";     
    }   
    //管理者
    class Women{    
        public Memento getMemento() {
            return memento;
        }       
        public void setMemento(Memento memento) {
            this.memento = memento;
        } 
        private Memento memento;    
    }
    //测试
    public static void main(String[] args) {
        Women women = new Test().new Women();
        Man man = new Test().new Man();
        man.say();
        //记录状态
        women.setMemento(man.createMemento());
        //改变状态
        man.setClothes("黑衣服");
        man.say();
        //恢复状态
        man.setClothes(women.getMemento().getClothes());
        man.say();
    }
}

: 以上就是备忘录模式的完整代码。Memento备忘录类中的成员变量clothes 负责存储Man类的穿衣状态,Man类中有负责创建备忘录的方法。用于存贮当前穿衣状态,Women类中对备忘录成员变量进行维护。当Man需要回退之前的状态的时候,则从Women中获取先前存储的备忘录,并从中获取穿衣状态信息,重新更改穿衣状态。

总结

优点
  1. 有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,这时,
    使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。
  2. 本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自行管理他们所需
    要的这些状态的版本。
  3. 当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。
缺点
  1. 如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。
  2. 当负责人角色将一个备忘录 存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,从而无法提醒用户一个操作是否很昂贵。
  3. 当发起人角色的状态改变的时候,有可能这个协议无效。如果状态改变的成功率不高的话,不如采取“假如”协议模式。