java双接口设计

         在备忘录模式中,需要设计一个宽接口(对某个某个特殊对象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());
    	}
    
    }
    
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值