设计模式--备忘录模式

Posted fating

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--备忘录模式相关的知识,希望对你有一定的参考价值。

一、概要

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

特点:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。  注意【并在该对象之外保存这个状态】这个说法。

使用场景:1、撤销键;2、游戏存档。

角色:

A:Memento:包含了要被恢复的对象的状态。

B:Originator:创建并在 Memento 对象中存储状态

C:Caretaker:对象负责从 Memento 中恢复对象的状态。

D:Client:客户端实现类

 

二、例子

A:Memento:包含了要被恢复的对象的状态。

技术图片
 1 package comm.pattern.action.memento;
 2 
 3 /**
 4  * 
 5  * @Title: Memento.java
 6  * @Package: comm.pattern.action.memento
 7  * @Description: 备忘录,记录状态
 8  * @author yangzhancheng
 9  * @2020年3月5日:下午10:32:14
10  *
11  */
12 public class Memento {
13 
14     private String state;
15 
16     public Memento(String state) {
17         this.state = state;
18     }
19 
20     public void setState(String state) {
21         this.state = state;
22     }
23 
24     public String getState() {
25         return state;
26     }
27 
28 }
View Code

 

B:Originator:创建并在 Memento 对象中存储状态

技术图片
 1 package comm.pattern.action.memento;
 2 
 3 /**
 4  * 
 5  * @Title: Originator.java
 6  * @Package: comm.pattern.action.memento
 7  * @Description: 创建者,备忘录需要记录它的状态
 8  * @author yangzhancheng
 9  * @2020年3月5日:下午10:32:40
10  *
11  */
12 public class Originator {
13 
14     private String state;
15 
16     public void setState(String state) {
17         this.state = state;
18     }
19 
20     public String getState() {
21         return state;
22     }
23 
24     //创建备忘录
25     public Memento createMemento() {
26         return new Memento(state);
27     }
28 
29     //反复备忘录的状态
30     public void restoreMemento(Memento m) {
31         this.setState(m.getState());
32     }
33 
34     public void show(){
35         System.out.println("状态:"+state);
36     }
37 }
View Code

 

C:Caretaker:对象负责从 Memento 中恢复对象的状态。

技术图片
 1 package comm.pattern.action.memento;
 2 
 3 /**
 4  * 
 5  * @Title: Caretaker.java
 6  * @Package: comm.pattern.action.memento
 7  * @Description: //管理者,主要管理备忘录
 8  * @author yangzhancheng
 9  * @2020年3月5日:下午10:34:33
10  *
11  */
12 public class Caretaker {
13     
14     private Memento memento;
15 
16     public void setMemento(Memento m) {
17         memento = m;
18     }
19 
20     public Memento getMemento() {
21         return memento;
22     }
23 }
View Code

 

D:Client:客户端实现类

技术图片
 1 package comm.pattern.action.memento;
 2 
 3 /**
 4  * 
 5  * @Title: ClientPush.java
 6  * @Package: comm.pattern.action.observer.push
 7  * @Description: 客户端实现类
 8  * @author yangzhancheng
 9  * @2020年3月3日:下午10:55:27
10  *
11  */
12 
13 public class Client {
14 
15     public static void main(String[] args) {
16         
17         //1.创建者初始化一个状态
18         Originator or = new Originator();
19         or.setState("01");
20         or.show();
21         
22         //2.创建外部备忘录--注意是外部备忘录
23         Caretaker cr = new Caretaker(); //创建一个管理对象,本对象可以用列表进行管理,本例子简化
24         cr.setMemento(or.createMemento()); 
25         
26         //3.设置新状态
27         or.setState("02");
28         or.show();
29         
30         //4.回复原来状态
31         or.restoreMemento(cr.getMemento()); // 恢复状态
32         or.show();
33     }
34 
35 }
View Code

 

运行结果

状态:01
状态:02
状态:01

 

三、总结

      后续补充,主要看看那些开源程序已经实现。

以上是关于设计模式--备忘录模式的主要内容,如果未能解决你的问题,请参考以下文章

19-备忘录(Memento)模式Ruby实现

设计模式----备忘录模式

设计模式之备忘录模式

设计模式14:备忘录模式

设计模式之备忘录模式

设计模式之备忘录模式