备忘录模式/Memento

备忘录模式/Memento

意图/适用场景:
备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。
备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并存储起来。在将来合适的时候把这个对象还原到存储时的状态。

UML:

备忘录模式/Memento

参与者:

  1. 发起人(Originator):需要保存自身状态的对象。它有两个功能,一是创建新的备忘录,一是恢复到已有的备忘录。
  2. 管理者(Caretaker):负责管理备忘录,最主要的功能有两个:一是把备忘录存储起来,一是从存储设备中读取备忘录。
  3. 备忘录接口(Memento):备忘录的公共接口,不提供任何方法。
  4. 备忘录宽接口(MementoWideIF):这一接口是给Originator使用的,主要面向状态管理的功能,提供读写状态的方法。
  5. 备忘录窄接口(MementoNarrowIF):这一接口是给Caretaker使用的,主要面向存储功能,提供序列化的方法。
  6. 具体备忘录(ConcreteMemento):同时实现宽窄两个接口,同时提供状态读写和序列化的功能。

要点:
本模式里一个关键的地方在于ConcreteMemento角色同时实现了MementoWideIF和MementoNarrowIF两个接口。之所以这样设计是出于接口隔离的考虑。Originator即状态的使用者不关心备忘录如果被存储;而管理者也不应该看到与状态有关的细节,它只关心备忘录的存储。所以最好让它们分别面向不同的接口,互相不知道另一方以及另一套接口的存在。

应用实例:
电视游戏中的save/load功能是一个很好的例子。当玩家保存游戏进度时,就相当于建立了一份备忘录并把它存储起来,当然玩家可以建立不只一份的备忘录。
当再次游戏时,可以从已保存的多个进度中选择一个,继续游戏,这时就相当于把游戏场景恢复到保存时的状态。

示例代码:

[java]
// Source code from file:  Caretaker.java

package designPatterns.Memento;

public class Caretaker {

public void saveMemento(Memento m) {
MementoNarrowIF mn = (MementoNarrowIF)m;
mn.serialize();
}

public Memento loadMemento() {
// This is just for demo.
// Caretaker don't know ConcreteMemento. It just get a Memento from other place.
return new ConcreteMemento();
}

}

// Source code from file:  ConcreteMemento.java

package designPatterns.Memento;

public class ConcreteMemento implements MementoWideIF, MementoNarrowIF {

private int state = 0;

public int getState() {
return state;
}

public void setState(int state) {
this.state = state;
}

public void serialize() {
System.out.println("Memento was serialized.");
}

}

// Source code from file:  Memento.java

package designPatterns.Memento;

public interface Memento {

}

// Source code from file:  MementoNarrowIF.java

package designPatterns.Memento;

public interface MementoNarrowIF extends Memento {
public void serialize();
}

// Source code from file:  MementoWideIF.java

package designPatterns.Memento;

public interface MementoWideIF extends Memento {
public void setState(int state);
public int getState();
}

// Source code from file:  Originator.java

package designPatterns.Memento;

public class Originator {

private int state = 0;

public Memento createMemento() {
ConcreteMemento m = new ConcreteMemento();
m.setState(state);
System.out.println("create memento with state "  state);
return m;
}

public void restoreMemento(Memento m) {
MementoWideIF mw = (ConcreteMemento)m;
state = mw.getState();
System.out.println("restore memento with state "  state);
}
}

// Source code from file:  User.java

package designPatterns.Memento;

public class User {
public static void main(String[] args) {
Originator o = new Originator();
Caretaker c = new Caretaker();
// save memento
Memento m = o.createMemento();
c.saveMemento(m);
// load memento
m = c.loadMemento();
o.restoreMemento(m);
}
}
[/java]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值