备忘录模式(Java)

行为模式是对不同对象之间划分责任和算法的抽象化,行为模式不仅仅是关于类和对象的,而且是关于他们之间的相互作用和相互通信。行为模式分为行为对象模式和行为类模式。行为类模式采用继承机制在类间分派行为。行为对象模式使用对象复合而不是继承。

备忘录模式:是一种行为对象型模式。在不破坏封装性的前提条件下,捕获一个对象的内部状态,并在改对象之外保存该状态。以后就可以将该对象恢复到以前保存的状态。

有时有必要记录一个对象的内部状态,为了允许客户取消不确定的操作或从错误中恢复过来,需要实现检查点和取消机制,而要实现这些机制,需要事先把对象的状态保存在某处,这样才能恢复以前的状态。但是对象通常封装了其状态,使得其状态不能被其他对象访问。在不破坏封装的前提条件下,保存对象的状态。备忘录模式是用来解决这个问题的。

备忘录参与者:备忘录类(Mementor),发起人类(Originator),负责人类(CareTaker)。

备忘录类(Mementor):将原发器的内部状态储存起来,原发器根据需要决定备忘录储存原发器的哪些内部状态。防止原发器以外的其他对象访问备忘录。备忘录有二个接口,一个是窄接口,一个是宽接口。CareTaker只能看到窄接口,他只能把备忘录传递给其他对象。相反Originator看到的是一个宽接口,允许它访问返回到先前状态所需的数据。

原发器类(Originator):创建一个备忘录对象,使用备忘录储存它的内部状态。

负责人类(CareTaker):负责保存好备忘录对象,不能检查或操作备忘录的内容。

在Java中,为了实现双接口,可以把Mementor类设置成Originator类的内部类。,从而将Mementor对象封装在Originator内,对外部提供一个标识接口MementoIF给CareTaker以及其他对象。这样Originator看到的是Mementor的所有接口,而CareTaker看到的仅是标识接口。

Mementor类和Originator类:

public class Originator{

private String state;

public Originator(){

//构造函数

}

public MementoIf createMemento(){

return new Memento(this.state);

}

public void setState(String state){

this.state=state;

System.out.println(“state=”+state);

}

//内部类

protected class Memento implements MementoIf{

private String saveState;

private Memento(String saveState){

this.saveState=saveState;

}

privatevoid setSaveState(String saveState){

this.saveState=saveState;

}

privateString getSaveState(){

}

}

接口MementoIf:

public Interface MementoIf{

}

CareTaker类:

public class CareTaker{

private MementoIf memento;

public MementoIf getMemento(){

return this.memento;

}

public void setMemento(MementoIf memento){

this.memento=memento;

}

}

备忘录在以下情况下使用:

(1)必须保存一个对象在某一个时刻的状态/部分状态,这样以后需要时它能够恢复到以前的状态。

(2)如果用一个接口来让其它对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。

备忘录模式最大的缺点是资源消耗够大,如果类的成员变量太多,就不可避免的占用大量的内存。

旁观者的姓名永远爬不到比赛的计分板上。

备忘录模式(Java)

相关文章:

你感兴趣的文章:

标签云: