备忘录模式-对象行为型

原理

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

组成

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

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

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

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

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

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

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

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

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

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

 “自述历史”模式

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

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

  

  备忘录角色有如下责任:

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

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

  发起人角色有如下责任:

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

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

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

  源代码

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

public interface MementoIF {

}

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

  

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;
        }

    }
}

  客户端角色类

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);
    }

}

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

  

时间: 2024-09-29 02:19:40

备忘录模式-对象行为型的相关文章

设计模式20:Memento 备忘录模式(行为型模式)

Memento 备忘录模式(行为型模式) 对象状态的回溯 对象状态的变化无端,如何回溯.恢复对象在某个点的状态? 动机(Motivation) 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态.如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的细节实现. 如何实现对象状态良好保存与恢复?同时又不会因而破坏对象本身的封装性. 意图(Intent) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样

Memento(备忘录)-对象行为型模式

1.意图 在布破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将对象恢复到原先保存的状态. 2.别名 Token 3.动机 为了允许用户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,必须将状态信息保存在某处,这样才能将对象恢复到它们先前的状态.备忘录是一个对象,它存储另一个对象在某个瞬间的内部状态,而后者称备忘录的原发器. 4.适用性 必须保存一个对象在某个时刻的状态,这样以后需要时它才能恢复到先前的状态. 如果一个用接口来

命令模式-对象行为型

原理 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作. 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.

中介者模式-对象行为型

原理 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式又称为调停者模式. 1)迪米特法则的一个典型应用:在中介者模式中,通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少,使得一个对象与其同事之间的相互作用被这个对象与中介者对象之间的相互作用所取代.因此,中介者模式就是迪米特法则的一个典型应用.2) 通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,中介者承担了中转

策略模式-对象行为型

原理 其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能. 1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理.策略模式通

访问者模式-对象行为型

原理 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 1)访问者模式中对象结构存储了不同类型的元素对象,以供不同访问者访问. 2)访问者模式包括两个层次结构,一个是访问者层次结构,提供了抽象访问者和具体访问者,一个是元素层次结构,提供了抽象元素和具体元素. 相同的访问者可以以不同的方式访问不同的元素,相同的元素可以接受不同访问者以不同访问方式访问.在访问者模式中,增加新的访问者无须修改原有系统,系统具有较好的可扩展性.

责任链模式-对象行为型

原理 在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 组成 责任链模式涉及到的角色如下所示: ● 抽象处理者(Handler)角色:定义出一个处理请求的接口.如果需要,接口可以定义出一个方法以设定和返回对下家的引用.这个角色通常由一个Java抽象类或者Java接口实现.上图中Handler类的

状态模式-对象行为型

原理 允许一个对象在其内部状态改变时改变它的行为.这个对象看起来似乎修改了它的类. 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的(stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,运行.每一种状态改变,都有可能要根据其他状态来更新处理.例如,开门状体,你不能在运行的时

设计模式 笔记 备忘录模式 Memento

//---------------------------15/04/27---------------------------- //Memento 备忘录模式----对象行为型模式 /* 1:意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可讲该对象 恢复到原先保存的状态. 2:别名: Token 3:动机: 4:适用性: 1>必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前的状态. 2>如果一个用接口来让其它对象直接得到这些