代码分析
//公共接口
interface Subject {
//公共方法
void request();
}
//委托类
class RealSubject implements Subject {
//委托类的request逻辑
@Override
public void request(){
System.out.println("RealSubject Eat eggs");
}
}
//代理类
class Proxy implements Subject {
//维持一个Subject引用
private Subject subject;
//初始化Proxy对象时,通过构造器注入的方式传入Subject引用
public Proxy(Subject subject){
this.subject = subject;
}
//代理类的request逻辑
@Override
public void request(){
before();
//调用真实委托对象的request方法
subject.request();
after();
}
//以下两个方法是扩展方法,分别在委托对象前后调用,已达到为委托类扩展功能的目的
private void before() {
System.out.println("begin eat eggs");
}
private void after() {
System.out.println("end eat eggs");
}
}
//客户端
public class Client {
public static void main(String args[]) {
//实例化委托类
RealSubject subject = new RealSubject();
//实例化代理类,传入委托类的引用
Proxy p = new Proxy(subject);
//调用代理类的request方法
p.request();
}
}
概念:
代理模式(Proxy Pattern),也称为委托模式(Delegate Pattern)。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用[1]。
代理模式可以用来干什么
可以在不改变委托类的前提下,添加新的功能(这里的新的功能假设是和委托类的业务逻辑本身无关的功能,比如添加日志、记录方法调用次数等)
代理模式结构图[2]:
代理模式结构说明:
1:RealSubject 是委托类,Proxy 是代理类;
2:Subject是委托类和代理类的抽象接口,客户端针对Subject编程;
3:Subject有一个Request()方法,委托类和代理类公有的,必须实现;
4:Proxy拥有对RealSubject的真实引用,一般通过构造方法注入这个引用;
5:Proxy的request方法中,调用了RealSubject类的request方法,并且可以在委托类的request方法前后调用其他方法。
总结:
网上资料太多,写作水平参差不齐,我只是想了解大神们讲的代理是啥,所以写了这篇。
演示代码是静态代理模式的实现,工作中不要使用,因为静态代理的代理逻辑不能复用,需要为每个委托类单独写代理类,会导致系统代理类越来越多。
工作中请使用Java动态代理或者CGLIB动态代理,由于代理一般用来实现AOP,推荐直接使用SpringAOP完成切面相关的功能
下一篇写Java动态代理
参考:
[1]:《Java与模式》P493
[2]: 代理模式结构图截取自设计模式Java版
设计模式延伸阅读:
设计模式Java版 以案例和讲故事的方式来讲述模式的不断演进,有图有代码,推荐入门来看
《研磨设计模式》很详细,排版和写作风格也挺好,推荐
《Java与模式》 模式很多都是结合着JavaAPI来讲的,可以更深层次的了解Java语言设计,但是排版和写作风格我不喜欢
一些大佬的博客:
https://www.jianshu.com/p/a1d094fc6c00 源码级解析,文章比较整洁清晰,另外还有一篇CGLIB动态代理的文章推荐看
https://my.oschina.net/huangyong/blog/161338 从静态代理到动态代理,从Java动态代理到CGLIB动态代理,再到Spring AOP,循序渐进
https://blog.csdn.net/lmj623565791/article/details/79278864 源码级解析,前半部分讲枚举的本质,后半部分讲代理的本质
http://rejoy.iteye.com/blog/1627405 源码级解析,源码解析较多,jdk版本可能是1.6?和我看的1.8有差异,但是主要代码没变
https://github.com/iluwatar/java-design-patterns 一个开源项目,自己没有时间看,不推荐看(学习还是看书吧,这个库仅供参考,收集癖.jpg)
(⊙o⊙)…我写着写着怎么像是在写书评了。。。