【设计模式】分析大法2--代理模式

引子

我们是怎么理解代码的?
模拟控制台的操作在脑中脑补调用过程
跟着执行过程
一个类一个类地看,
类中,一个方法一个方法地看。

今天,就跟着我一起脑补执行过程吧


这里写图片描述
这里写图片描述


代理实现的功能是什么?
且听我慢慢道来


执行过程

这里写图片描述


首先执行的代码是

这里写图片描述

将代理类 Rroxy实例化,创建(new) proxy

这里写图片描述
这里写图片描述

   实例化Proxy代理类的时候,调用的是Proxy类的构造函数,没有额外声明,就调用默认的空的构造函数。

然后返回执行第二行代码:

这里写图片描述

Proxy类中的Request方法是对父类的抽象方法进行改写

这里写图片描述

这里写图片描述 可知父类是Subject类

Proxy类的父类 Subject抽象类:

这里写图片描述

仅声明了一个抽象方法 Request()
同时我们发现,还有一个类继承了Subject类

这里写图片描述

它就是RealSubject类

这里写图片描述

这个类里也重写(override)了Request方法

那到底调用哪个Request方法,控制台会显示什么结果呢?

我们仔细看Proxy类

这里写图片描述

这里写图片描述

声明 RealSubject 委托人类的变量,便于代码编写时使用。
注意并没有new RealSubject(), 并被分配空间,没有形成实例

这里写图片描述
这里写图片描述

通过上面的RealSubject类的声明,我们可以知道,如果RealSubject类被实例化,并调用了实例化对象的Request方法,则控制台上会有返回值“真实的请求”,反之,如果仅是实例化了RealSubject类,只要没有调用其Request方法就不会有返回值。

判断的解释:
如果声明的RealSubject类的realSubject 没有值,至少说明它没有被实例化且调用了Request方法,为了调用Request方法,我们首先要有实例化的RealSubject对象。(从中我们知道,Request方法是从实例化的RealSubject类中调用的)

如果声明的RealSubject类的realSubject有值,至少说明它已经被实例化且调用了Request方法。此时,RealSubject类一定已经被实例化了,故可以不再实例化。

经if语句确定有实例化的RealSubject类的对象realSubject之后,
执行下一行代码:

这里写图片描述


调用RealSubject类的实例化对象的Request方法,
运行结果,显然,是在控制台上显示“真实的请求”


即 控制台调用的是

这里写图片描述

实际上调用的是

这里写图片描述

控制台显示的结果是:

  真实的请求

生活中的例子:

   你去买房子,一般都会通过中介,中介就相当于这里的代理,中介从你这获取了购房款进行交易,最终买下的房子,不是中介的,还是你的。

代理的好处

不知道委托人是谁,一个代理可以统一处理多个委托人的信息,减少通信开销,提高运行效率和系统的吞吐量。
当无法访问委托人的时候,可以添加一个代理来进行间接访问。

代理的实现核心

统一的接口(继承自同一个抽象类,并声明抽象的代理方法);
在代理中声明委托人,调用委托人的方法。

这里写图片描述

现在看这个UML图,类与类之间的关系是不是很清晰了呢?



如果本文帮助到了你,请给小编点个赞,鼓励,鼓励一下

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值