备忘录模式

对象状态的回溯

  对象状态的变化无端,如何回溯/恢复对象在某个点的状态

image

  如果我们想恢复对象的状态,那么我们可能首先想到的是把对象保存下来,但是这样会破坏对象的封装性。因为对象有状态有操作,如果我们为了保存对象而留着原来的对象,做一个深拷贝,那么其他对象也能通过这个对象的接口访问这个对象状态,这并不是我们所希望的。而我们需要它的职责只是保存和恢复对象状态,而不应在上面支持对对象状态访问的接口,这就产生了Memento模式。

  动机(Motivation)

  在软件构建过程中,某些对象的状态在转换的过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。

  如何实现对象状态的良好保存与恢复?但同时又不会因此而破坏对象本身的封装性。

  意图(Intent)

  在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态(如果没有这个关键点,其实深拷贝就可以解决问题)。这样以后就可以将该对象恢复到原先保存的状态。

 

类图:                                                                                                          

 

 

package Memento;

/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 16:11:54
 * <p/>
 * note: 备忘录(快照)角色
 */
class Memento {
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }
}
/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 16:12:27
 * <p/>
 * note: 负责人角色
 */
class Caretaker {

    private Memento memento;

    /**
     * 返回快照
     * @return
     */
    public Memento retrieveMemento() {
        return this.memento;
    }

    /**
     * 保存快照
     * @param memento
     */
    public void saveMemento(Memento memento) {
        this.memento = memento;
    }
}
/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 16:11:41
 * <p/>
 * note: 发起人角色
 */
class Originator {
    private String state;

    /**
     * 创建一个快照
     * @return
     */
    public Memento createMemento() {
        return new Memento(state);
    }

    /**
     * 从快照中还原
     * @param memento
     */
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
        System.out.println("Current state = " + this.state);
    }
}
/**
 * User: liuwentao@wentao365.com
 * Date: 2008-12-9 Time: 16:12:36
 * <p/>
 * note:  客户端角色
 */
public class MementoTest1 {
    private static Originator originator = new Originator();
    private static Caretaker caretaker = new Caretaker();

    public static void main(String[] args) {
        //发起人角色设置状态
        originator.setState("On");

        //负责人角色 保存快照
        caretaker.saveMemento(originator.createMemento());

        //发起人角色改变状态
        originator.setState("Off");

        //恢复发起人先前状态
        originator.restoreMemento(caretaker.retrieveMemento() );
    }
}

 

 

转载: http://hi.baidu.com/fendou4533/blog/item/877b3f834207ce0ac75cc361.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值