4000-9696-28

大话设计模式之代理模式

2023年03月09日 13:31供稿中心:北大青鸟总部

摘要: 所谓代理模式就是给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用,比如我们在完成一件事情的时候,需要通过中介来完成,而这个中介就类似一个代理的角色,这种情况在我们的程序中就叫做代理模式。

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



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

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

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

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

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

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


代理模式定义

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


代理模式的特点

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

  • 安全性

  • 耦合性

  • 扩展性


安全性

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

耦合性

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

扩展性

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



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

人类:什么?还有缺点,

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

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

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


  • 复杂性

  • 性能


复杂性

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

性能

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


代理模式实现方式

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

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

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

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

/**
* 婚介所
*/
public interface Matchmaking {


// 撮合类,撮合单身男女的方法
public void Match();
}


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

/**
* 程序猿--->真实的对象
*/
public class ProgrammerReal implements Matchmaking {
public void Match() {
System.out.println("努力找女朋友中....");
}
}


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

/**
* 非诚勿扰婚介所--->代理对象
*/
public class FeiChengWuRaoProxy 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();
}
}


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



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


标签:
关于我们
公司简介
发展历程
青鸟荣誉
联系我们
加入我们
青鸟课程
BCVE视频特效课程
BCUI全链路UI设计
BCSP软件开发专业
BCNT网络工程师
启能职业教育基础课程
学习客户端下载
青鸟优师
青鸟云课堂
微信 公众号 咨询 顶部 首页
官方新版意见收集

*

官方新版意见收集

提交成功,感谢您的反馈。

我们会认真阅读和考虑每个用户的反馈。