生活中,我们买房子或者卖房子的时候,大多数的情况下我们是不能直接找到并面对客户的,这个时候我们往往会借助中介或者代理的方式来完成我们的想法。与此类似的,在软件设计中,使用代理模式的例子也很多,下面我们简要说明。
定义与特点
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。简单来说就是,为一个类(委托类)创建一个代理类,由代理类来代表它来对外提供功能。
代理模式的优缺点:
优点有:
缺点是:
代理模式的构造方式:
首先要明确两个角色,一个是委托类,一个是代理类。二者共同实现一个公共接口。
沿着这个思路我们设计这样一个场景。比如富豪张三(Zhangsan)无故被人抹黑造谣,由于自己公务繁忙,无法到公共场合为自己发表清白声明,于是找到了律师(Lawyer)代自己公开进行一份声明。下面就是我们的代码秀:
//公共接口interface Announce { //对外声明 void declare();}//委托人class Zhangsan implements Announce { //对外声明 public void declare() { System.out.println("我是张三,我是清白的。巴拉巴拉巴拉巴拉巴拉啦啦啦啦啦"); }}//代理人class Lawyer implements Announce { //声明为张三提供服务 private Announce zhangsan = new Zhangsan(); //对外声明 public void declare() { this.preDeclaration() //张三的实际发声 zhangsan.declare(); this.postDeclaration(); } //礼貌起见,声明之前介绍自己身份 private void preDeclaration() { System.out.println("大家好,我是张三先生的私人律师"); } //礼貌起见,声明完成之后可以致谢 private void postDeclaration() { System.out.println("感谢大家对张三先生的支持"); }}//写了半天,我们来测试下实际效果public class ProxyAnnounce{ public static void main(String[] args){ private Announce lawyer = new Lawyer(); lawyer.declare(); }}输出结果为:大家好,我是张三先生的私人律师我是张三,我是清白的。巴拉巴拉巴拉巴拉巴拉啦啦啦啦啦感谢大家对张三先生的支持
上面是一个很简单的例子,可以看出,我们想对外开放某些功能,就可以将这些功能在代理类中被引用,如此一来,屏蔽了我们不想外露的功能,只将我们想开放的功能开放出来。亦即委托类中其实是可以有很多方法的,很多功能的,我们可以酌情对外开放,代理类犹如一道大门,将委托类与外部调用者隔绝开来,只将部分功能赋予这个大门,来代替委托类行使这个功能,哪怕最终还是要牵扯到自身(因为最终还是要调用委托类的对应方法实现)。
如若有想学习和交流Java的朋友,可添加微信 :zhuawac,请备注来意,否则会被拒哦!
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!