一文了解代理模式

最近猿小二,在生活上遇到了一些挫折;既然是挫折,想来可能不是什么好事儿,但是对于身为程序员的猿小二来说,凡事儿总喜欢刨根问底,追求事物的本质,充分体现了程序员对任何事情都特别的认真(一根筋)的人生态度;就像很多技术极客都信奉的"钢铁侠"所推崇的 "第一性原理",遇到问题总会探寻问题的本质。

这不最近猿小二在租房子的时候,就将生活中的找中介租房的事情,跟酷酷的编码联系在了一起,更加深刻的理解了什么是"艺术来源于生活"

我们都知道,对于大部分"漂"来说,租房是关乎我们在一座城市生存下来的最根本的因素,所以几乎每个人都逃脱不了租房的命运。

在租房的过程中,我们通常情况下,我们是不知道具体的房源的信息的,这时候都会通过一个中介来帮我们找到合适的房源,而我们也是最终通过中介这个角色来完成租房的一系列的事情。

像这种我们在完成一件事情的时候,需要通过中介来完成,而这个中介就类似一个代理的角色,这种情况在我们的程序中就叫做代理模式。

而这种现象其实在我们的生活中是比较多见的,比如:购买火车票不一定要去火车站买,可以通过12306 网站或者去火车票代售点买,或者第三方的代理机构,携程、同城等。

再比如:找工作,通常都是在一些招聘网站,或者朋友内推等方式。甚至现在找女朋友,都可以有中介来完成,这也是程序员的一大福音啊,简直是造福人类啊,哈哈哈哈...我们再来看下官方的定义。

 

代理模式定义

所谓代理模式就是给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用,在我们上面的例子中目标对象就是房源,代理对象就是中介。

 

代理模式的特点

既然"艺术来源于生活",本着存在即合理的人生哲学,中介和代理模式的出现也一定有它的的意义;所以我们先来探讨下代理模式的特点,我们先来说说他的优点。

安全性

耦合性

扩展性

 

安全性

当我们的客户端去调用目标对象的时候,就可以通过一个代理对象来完成,这样就可以保护目标对象的安全,避免很多的客户端都去直接调用目标对象。

耦合性

将客户端对象和目标对象分离开来,通过一个代理对象来完成相应的功能,一定程度上是降低了系统之间的耦合性。

扩展性

通过展性杂性展目标对象的功能,这个在我们学习框架的时候,就会经常遇到,比如:Spring框架中的AOP其原理就是通过代理模式来完成的。

优点说完了,夸也夸了,本着公平的原则,我们也的来说代理模式的缺点......

人类:什么?还有缺点,

上帝:当然了,我不仅在造人的时候,造了男人和女人,在创造任何事物的时候,都给了优点和缺点,所以你们人类世界才那么丰富多彩。

人类:好了,你说吧;心想:世界上的那么多坏人原来都是你搞的鬼....

于是上帝开始了它的即兴演讲,话说代理模式的缺点,稍微比优点少了一个,只有两个而已,嘿嘿..

复杂性

性能

 

复杂性

本来客户端可以直接和目标对象建立关系,直接调用,非要加上一个代理对象,无疑是增加了系统的复杂性,多一事不如少一事。

性能

还是刚才说的,好端端的多出了有一个代理对象,系统在创建对象的时候,是不是就要多创建一个代理对象(这可真是抠啊)。

 

代理模式实现方式

好了,到这里道理我们都了解了,接下来咱么就来看看,代理模式在代码中是如何应用的,下面咱么会通过一个小案例来加深对代理模式的理解。

接下来咱么就以一个大家都喜闻乐见的案例来演示下代理模式。

这个过程中总共需要两个类和一个接口,一个是目标对象,一个是代理对象,还有一个顶层的抽象接口。

首先,咱么先来抽象出一个顶层的接口,这是婚介所的抽象接口。

/**

* 婚介所

*/

public interface Matchmaking {

 // 撮合类,撮合单身男女的方法

 public void Match();

}

然后我们创建目标对象,它就是程序猿,也就是真实对象,程序猿人生最大的目标就是找到女朋友了。

/**

* 程序猿--->真实的对象

*/

public classProgrammerReal implements Matchmaking {

 public void Match() {

 System.out.println("努力找女朋友中....");

  }

}

最后还要创建代理对象,这个代理对象就是传说中的婚介所,广大程序猿的福音。

/**

* 非诚勿扰婚介所--->代理对象

*/

public classFeiChengWuRaoProxy implements Matchmaking {

 // 持有的真实对象

ProgrammerReal real = new ProgrammerReal();

 public void Match() {

 // 扩展功能

 System.out.println("程序猿没有女朋友..........");

 // 调用真是对象

      real.Match();

 // 扩展功能

 System.out.println("程序猿找到了女朋友........哈哈哈");

  }

}

到这里代码就齐活了,最后为了验证下我们的理论,还要进行下测试,上代码。

/**

* 代理模式测试

*/

public class ProxyTest {

 public static void main(String[] args) {

 // 创建代理对象

FeiChengWuRaoProxy proxy = new FeiChengWuRaoProxy();

      proxy.Match();

  }

}

看结果,结果显示,程序猿通过婚介所成功找到了女朋友,说明我的测试是没问题。

同时通过上面的这个案例,也告诉大家婚介所是真的有用的,广大程序猿们可以试一试,万一实现了呢。

 

喜欢我们的文章吗?还想了解互联网哪些技术,欢迎留言告诉我们

【AI课工场】互联网知识也能如此好玩~

更多热门互联网技术文章抢先知微信公众号【kgc-cn】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值