引子
我们是怎么理解代码的?
模拟控制台的操作在脑中脑补调用过程
跟着执行过程
一个类一个类地看,
类中,一个方法一个方法地看。
今天,就跟着我一起脑补执行过程吧
代理实现的功能是什么?
且听我慢慢道来
执行过程
首先执行的代码是
将代理类 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图,类与类之间的关系是不是很清晰了呢?
如果本文帮助到了你,请给小编点个赞,鼓励,鼓励一下