其实,代理模式在生活中的应用不少,典型的例如明星的经纪人,外界与明星的联系都由经纪人来负责,什么电话该接进来,什么活动该拒绝都交给经纪人,这样在最大程度上保护了明星的隐私。这种模式也符合单一职责约束,明星只用作好本身的事情,其余的杂事经纪人会搞定的。设计模式
下面,咱们就来用代码模拟一下明星和经济人的场景,从而了解代理模式的具体用法。ide
做为利益共同体,经纪人和明星须要具备共同的行为,只不过真正作事的是明星,经纪人负责传话,所以他们须要一个共同Activiey接口:this
public interface Activity { public void interview(); public void arietyShow(); }
明星类:spa
public class Star implements Activity{ @Override public void interview() { System.out.println("明星接受采访。。。"); } @Override public void arietyShow() { System.out.println("明星参加综艺节目。。。"); } }
经纪人类:设计
public class Agent implements Activity{ Star star; public Agent(Star star){ this.star = star; } @Override public void interview() { this.star.interview(); } @Override public void arietyShow() { this.star.arietyShow(); } }
接下来就能够模拟一下明星-经纪人这种代理场景的运做了:代理
public class ProxyTest { public static void main(String[] args) { Agent agent = new Agent(new Star()); agent.arietyShow(); agent.interview(); } }
输出为:code
明星参加综艺节目。。。
明星接受采访。。。
上面简单介绍了代理模式的概念和具体场景的使用,那么,代理模式的正式定义是怎样的呢,Gof四人组给出的定义是:对象
代理模式为对象提供一个替身,从而控制对这个对象的访问。blog
外界的请求经过代理到达实际对象,实际对象的响应经过代理返回给外界。代理模式一个明显的优势是限制外界对对象的访问,从而起到保护对象的做用,缺点是增长了复杂性,并且因为须要代理作转换,增长了调用链的长度。接口
将明显-经纪人的结构抽象出来,就能够获得代理模式的通常结构,以下:
当因为某种缘由不能将对象直接暴露给外界时,或者须要限制对对象的访问时,就能够考虑使用代理模式。本文介绍的代理模式是基于代理对象和实际对象在同一个JVM堆上的情形,除此以外,代理模式还有如下几种:
<<Head First设计模式>>
<<大话设计模式>>