代理模式一:初识代理模式

版权声明:如果觉得文章对你有用,转载不需要联系作者,但请注明出处 https://blog.csdn.net/jinxin70/article/details/82949068

代码分析

//公共接口
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⊙)…我写着写着怎么像是在写书评了。。。

猜你喜欢

转载自blog.csdn.net/jinxin70/article/details/82949068