〇、前言
在2014年的时候,有一部非常火爆的电视剧叫做《离婚律师
》,里面讲述了两名离婚律师池海东
和罗郦
的爱恨情仇,片子非常好看,当时我自己也怒刷了好几遍。
那么,在本剧的第四集中,有一段非常搞笑的剧情:
美玉给罗郦介绍了吕晨,也就是自己婚礼的伴郎,让两人相亲。巧的是,罗郦(
姚晨扮演
)和吕晨(李晨扮演
)相亲时,池海东正和助理小刚在隔壁桌谈事情。吕晨说起罗郦在法庭上大败池海东的事,碰巧被池海东听见,他大为光火。吕晨和罗郦非常聊得来,吕晨说的一切有关未来婚姻生活的畅想,罗郦都很中意,可是吕晨居然总结了一句万事俱备只欠离婚。原来他有老婆,正在打离婚,他想请罗郦做自己的代理律师。罗郦气得转身就走,池海东却向吕晨递上名片,表示自己很有兴趣接他的案子……
本来是个男方的甜蜜相亲局,竟然被对方邀请作为离婚案件的代理律师,这一肚子气,真够受的了。那为什么需要代理律师呢? 因为吕晨对法律章程并不熟知,所以他需要代理律师帮着他去处理离婚案件,那么如果在过程中,如果需要客户提供一些个人信息的时候,再由代理律师去找吕晨即可。所以,代理律师就成为了吕晨与法官之间的一个必不可少的环节了。
代理律师的作用我们大致了解了,那么,这与我们今天要介绍的代理模式有什么关系呢?其主要的重点就在代理上了。当我们想要基于某个对象上再增加一些逻辑操作的时候,我们就可以是用代理模式了。真实对象与代理对象同属一个接口,那么,对于客户来说,也是无感知的了。下面我们来进入正题,好好聊一聊这个代理模式。
一、模式定义
代理模式的定义如下所示:
代理模式为另一个对象提供一个替身或占位符,以控制对这个对象的访问。使用代理模式创建代理对象,让代理对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。在SpringAOP中采用的JDK动态代理,就是最典型的例子。
代理模式所解决的问题:
当我们想要对一个业务类进行某些横切性的增强时,例如:增加请求与响应的日志、增加权限校验、增加远程请求对象封装等等。我们可以采用代理模式去实现,而不需要修改原有的类。
二、类图
在代理模式中,我们需要两个对象:真实对象
和代理对象
;那么对于客户来说呢,他们其实并不在意是真实对象还是代理对象,他们只是需要这个对象可以实现某些行为即可。所以,为了让客户的操作“无感知”,我们就需要真实对象与代理对象是属于同一个接口。这样,当我们基于接口编程的时候,在客户眼中,他操作的只是这个接口的某个方法而已。
下面我们来看一下代理模式的通用类图,其中Subject
是一个接口,真实对象RealSubject
和代理对象Proxy
都实现了这个接口,为了可以具有真实对象的能力,需要将真实对象RealSubject
组合到代理对象Proxy
中,具体类图如下所示:
6.3> 类的实现
实现真实对象与代理对象的统一接口Subject:
public interface Subject {
void request();
}
实现Subject接口,创建真实对象RealSubject:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("-----RealSubject 开始执行业务操作-----");
}
}
实现Subject接口,创建代理对象Proxy:
public class Proxy implements Subject {
// 被代理的对象
private Subject subject;
public Proxy(Subject subject) {
this.subject = subject;
}
@Override
public void request() {
beforeProcessor();
subject.request();
afterProcessor();
}
private void beforeProcessor() {
System.out.println("-----Proxy before processor-----");
}
private void afterProcessor() {
System.out.println("-----Proxy after processor-----");
}
}
实现测试类ProxyTest:
public class ProxyTest {
public static void main(String[] args) {
Subject subject = new Proxy(new RealSubject());
subject.request();
}
}
通过输出结果我们可以看到,客户调用的request()
方法,其实是代理对象Proxy的request()
方法:
-----Proxy before processor-----
-----RealSubject 开始执行业务操作-----
-----Proxy after processor-----
Process finished with exit code 0
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」