最近猿小二,在生活上遇到了一些挫折;既然是挫折,想来可能不是什么好事儿,但是对于身为程序员的猿小二来说,凡事儿总喜欢刨根问底,追求事物的本质,充分体现了程序员对任何事情都特别的认真(一根筋)的人生态度;就像很多技术极客都信奉的"钢铁侠"所推崇的 "第一性原理",遇到问题总会探寻问题的本质。
这不最近猿小二在租房子的时候,就将生活中的找中介租房的事情,跟酷酷的编码联系在了一起,更加深刻的理解了什么是"艺术来源于生活"
我们都知道,对于大部分"漂"来说,租房是关乎我们在一座城市生存下来的最根本的因素,所以几乎每个人都逃脱不了租房的命运。
在租房的过程中,我们通常情况下,我们是不知道具体的房源的信息的,这时候都会通过一个中介来帮我们找到合适的房源,而我们也是最终通过中介这个角色来完成租房的一系列的事情。
像这种我们在完成一件事情的时候,需要通过中介来完成,而这个中介就类似一个代理的角色,这种情况在我们的程序中就叫做代理模式。
而这种现象其实在我们的生活中是比较多见的,比如:购买火车票不一定要去火车站买,可以通过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】