GOF设计模式之代理模式(结构型代理模式)

简介: GOF设计模式之代理模式(结构型代理模式)

🌚代理模式是什么


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


🌚代理模式能干什么


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


🌚代理模式优缺点


优点

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


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


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


缺点

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


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


🌚代理模式构成


抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。

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

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


辅助图示


1.png

示例代码


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();
    }
}

运行结果

访问真实主题之前的预处理。
调用真实主题角色业务方法。
访问真实主题之后的后续处理。
相关文章
|
10天前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
21天前
|
设计模式 Java
Java一分钟之-设计模式:装饰器模式与代理模式
【5月更文挑战第17天】本文探讨了装饰器模式和代理模式,两者都是在不改变原有对象基础上添加新功能。装饰器模式用于动态扩展对象功能,但过度使用可能导致类数量过多;代理模式用于控制对象访问,可能引入额外性能开销。文中通过 Java 代码示例展示了两种模式的实现。理解并恰当运用这些模式能提升代码的可扩展性和可维护性。
33 1
|
21天前
|
设计模式 存储 缓存
第三篇 结构型设计模式 - 简化复杂系统的结构
第三篇 结构型设计模式 - 简化复杂系统的结构
|
23天前
|
设计模式 安全 网络协议
【设计模式】代理模式例子解析
【设计模式】代理模式例子解析
18 2
|
23天前
|
设计模式 JavaScript 算法
js设计模式-策略模式与代理模式的应用
策略模式和代理模式是JavaScript常用设计模式。策略模式通过封装一系列算法,使它们可互换,让算法独立于客户端,提供灵活的选择。例如,定义不同计算策略并用Context类执行。代理模式则为对象提供代理以控制访问,常用于延迟加载或权限控制。如创建RealSubject和Proxy类,Proxy在调用RealSubject方法前可执行额外操作。这两种模式在复杂业务逻辑中发挥重要作用,根据需求选择合适模式解决问题。
|
23天前
|
设计模式 存储 Java
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
[设计模式Java实现附plantuml源码~结构型]实现对象的复用——享元模式
|
23天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
[设计模式Java实现附plantuml源码~结构型]处理多维度变化——桥接模式
|
23天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
[设计模式Java实现附plantuml源码~结构型]不兼容结构的协调——适配器模式
|
23天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~结构型]对象的间接访问——代理模式
[设计模式Java实现附plantuml源码~结构型]对象的间接访问——代理模式
|
15天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)