天天看点

GOF设计模式之代理模式(结构型代理模式) ✨ 每日积累

🌚代理模式是什么

​ 代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。为其他对象提供一种代理以控制对这个对象的访问。

🌚代理模式能干什么

​ 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

🌚代理模式优缺点

优点

1、职责清晰:代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用

2、高扩展性:代理对象可以扩展目标对象的功能

3、智能化:代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性

缺点

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

🌚代理模式构成

  1. 抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。
  2. 真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
  3. 代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。

辅助图示

GOF设计模式之代理模式(结构型代理模式) ✨ 每日积累

示例代码

1、抽象主题角色

public interface Subject {
    void doRequest();
}
           

2、真实主题角色

public class RealSubject implements Subject{
    @Override
    public void doRequest() {
        System.out.println("调用真实主题角色业务方法。");
        //业务方法
    }
}
           

3、代理角色

public class Proxy implements Subject{
    private RealSubject realSubject;

    @Override
    public void doRequest() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.doRequest();
        postRequest();
    }

    public void preRequest() {
        System.out.println("访问真实主题之前的预处理。");
        //预处理,对真是对象不合理的调用操作直接返回,项目中的sql注入,恶意请求,非标操作等都可以在这一步处理掉
    }
    public void postRequest() {
        System.out.println("访问真实主题之后的后续处理。");
        //请求后置处理业务,对真实对象的一些录入操作
    }
}
           

4、Client

public class TestClient {
    public static void main(String[] args) {
        Subject subject = new Proxy();
        subject.doRequest();
    }
}
           

运行结果

访问真实主题之前的预处理。
调用真实主题角色业务方法。
访问真实主题之后的后续处理。