代理模式详解(作用分类及应用场景)

代理模式详解(作用分类及应用场景)-mikechen

代理模式定义

代理模式,英文名Proxy Pattern,是一种结构型设计模式,代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接地调用实际的对象。

代理模式通过代理对象控制对原对象的访问,并允许在访问前或访问后做一些处理。

 

代理模式作用

通过代理模式,我们可以很好地做到功能的分离,在用户无感知的情况下,在方法执行的前后增加一些操作,增强代码的功能。

 

代理模式分类

代理模式主要分为两类,静态代理和动态代理。

1.静态代理

静态代理是由程序员编写的代理类,并在程序运行前就编译好的,而不是由程序动态产生代理类,这就是所谓的静态代理。

 

2.动态代理

可以服务多个接口实现类,可以在程序运行时,通过反射机制动态创建代理对象。

 

代理模式角色

代理模式的主要分为3大角色,如下图所示:

代理模式详解(作用分类及应用场景)-mikechen

1.抽象主题(Subject)角色

抽象主题角色:通过接口,或抽象类声明真实主题和代理对象实现的业务方法。

2.真实主题(Real Subject)角色

实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。

3.代理(Proxy)类角色

提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问控制或扩展真实主题的功能。

 

代理模式实现

1.定义抽象主题

//抽象主题
interface Subject {
    void Request();
}

2.定义真实主题

//真实主题
class RealSubject implements Subject {
    public void Request() {
        System.out.println("访问真实主题方法...");
    }
}

3.定义代理角色

//代理
class Proxy implements Subject {
    private RealSubject realSubject;
    public void Request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.Request();
        postRequest();
    }
    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
    }
    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
    }
}

4.代理测试

public class ProxyTest {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.Request();
    }
}

 

代理模式应用场景

  • 日志的采集
  • 权限控制
  • 实现aop
  • Mybatis mapper
  • Spring的事务
  • 全局捕获异常
  • Rpc远程调用接口
  • 分布式事务原理代理数据源

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法