在备忘录模式中,需要设计一个宽接口(对某个某个特殊对象SpecialObject提供的接口),而窄接口对所有对象(OtherObject)提供的接口。怎样才能满足这样的需求呢?这种情况应该把宽接口设计成SpecialObject的内部类,但是有个问题就是这个类的接口方法不能被其他对象调用,需要做的就是把这个内部类的所有方法设置为private,那么怎样暴露一个窄接口给外部呢? 有个最窄的接口就是标记接口(类似Cloneable接口)只起一个标记左右,里面没有任何方法的申明。可以让这个内部实现标记接口,然后通过这个接口发布出去。这样就实现了这个需求。下面用双接口模式实现备忘录模式
备忘录模式:
备忘录模式的结构
- 发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。
- 备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。
- 管理角色:对备忘录进行管理,保存和提供备忘录。
- 我们只希望对发起人提供宽接口,而不希望对管理角色提供宽接口,管理角色不应该有权限改变备忘录,它只负责存储备忘录。因此需要给管理角色提供一个窄接口的备忘录。
代码实现
-
package com.memo.pattern; /** * 一个标记接口 * @author luochao * */ public interface NarrowInterface { }
-
package com.memo.pattern; import java.io.Closeable; public class SpecialObject { //发起人状态 private String state; public SpecialObject(){ } public NarrowInterface createNarrow(){ return new Memo(this.state); } public void RestoreState(NarrowInterface memo){ Memo memoto = (Memo)memo; this.setState(memoto.getSaveState()); } //备忘录对象 class Memo implements NarrowInterface{ private String saveState; //private construct method private Memo(String saveState) { this.saveState = saveState; } public String getSaveState() { return saveState; } public void setSaveState(String saveState) { this.saveState = saveState; } } public String getState() { return state; } public void setState(String state) { this.state = state; } }
package com.memo.pattern; public class Other { private NarrowInterface memo; public NarrowInterface getMemo() { return memo; } public void saveMemo(NarrowInterface memo) { this.memo = memo; } }
package com.memo.pattern; public class Client { private static SpecialObject o = new SpecialObject(); private static Other other = new Other(); public static void main(String[] args) { o.setState("off"); //管理者保存备忘录对象 other.saveMemo(o.createNarrow()); o.setState("on"); //从管理者对象中取出之前存档的备忘录用来恢复状态 o.RestoreState(other.getMemo()); } }