返回备忘录模式-对......登陆

备忘录模式-对象行为型

阿神2016-11-09 15:46:48511

原理

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。

组成

下载.png

  备忘录模式所涉及的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。

备忘录(Memento)角色又如下责任:

  (1)将发起人(Originator)对象的内战状态存储起来。备忘录可以根据发起人对象的判断来决定存储多少发起人(Originator)对象的内部状态。

  (2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。

发起人(Originator)角色有如下责任:

  (1)创建一个含有当前的内部状态的备忘录对象。

  (2)使用备忘录对象存储其内部状态。

负责人(Caretaker)角色有如下责任:

  (1)负责保存备忘录对象。

  (2)不检查备忘录对象的内容。

 “自述历史”模式

  所谓“自述历史”模式(History-On-Self Pattern)实际上就是备忘录模式的一个变种。在备忘录模式中,发起人(Originator)角色、负责人(Caretaker)角色和备忘录(Memento)角色都是独立的角色。虽然在实现上备忘录类可以成为发起人类的内部成员类,但是备忘录类仍然保持作为一个角色的独立意义。在“自述历史”模式里面,发起人角色自己兼任负责人角色。

  “自述历史”模式的类图如下所示:

下载 (1).png

  备忘录角色有如下责任:

  (1)将发起人(Originator)对象的内部状态存储起来。

  (2)备忘录可以保护其内容不被发起人(Originator)对象之外的任何对象所读取。

  发起人角色有如下责任:

  (1)创建一个含有它当前的内部状态的备忘录对象。

  (2)使用备忘录对象存储其内部状态。

 客户端角色有负责保存备忘录对象的责任。

  源代码

  窄接口MementoIF,这是一个标识接口,因此它没有定义出任何的方法。

1

2

public interface MementoIF {

}

  发起人角色同时还兼任负责人角色,也就是说它自己负责保持自己的备忘录对象。  

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

public class Originator {

   public String state;

   /**

    * 改变状态

    */

   public void changeState(String state){

       this.state = state;

       System.out.println("状态改变为:" + state);

   }

   /**

    * 工厂方法,返还一个新的备忘录对象

    */

   public Memento createMemento(){

       return new Memento(this);

   }

   /**

    * 将发起人恢复到备忘录对象所记录的状态上

    */

   public void restoreMemento(MementoIF memento){

       Memento m = (Memento)memento;

       changeState(m.state);

   }

    

   private class Memento implements MementoIF{

        

       private String state;

       /**

        * 构造方法

        */

       private Memento(Originator o){

           this.state = o.state;

       }

       private String getState() {

           return state;

       }

        

   }

}

  客户端角色类

1

2

3

4

5

6

7

8

9

10

11

12

13

public class Client {

   public static void main(String[] args) {

       Originator o = new Originator();

       //修改状态

       o.changeState("state 0");

       //创建备忘录

       MementoIF memento = o.createMemento();

       //修改状态

       o.changeState("state 1");

       //按照备忘录恢复对象的状态

       o.restoreMemento(memento);

   }

}

  由于“自述历史”作为一个备忘录模式的特殊实现形式非常简单易懂,它可能是备忘录模式最为流行的实现形式。


最新手记推荐

• 用composer安装thinkphp框架的步骤• 省市区接口说明• 用thinkphp,后台新增栏目• 管理员添加编辑删除• 管理员添加编辑删除

全部回复(0)我要回复

暂无评论~
  • 取消回复发送