GoF设计模式:代理模式(Proxy Pattern)—对象的间接访问


GoF设计模式:代理模式(Proxy Pattern)—对象的间接访问

模式概述

近年来,代购已逐步成为电子商务的一个重要分支。何谓代购,简单来说就是找人帮忙购买所需要的商品,当然你可能需要向实施代购的人支付一定的费用。代购通常分为两种类型:一种是因为在当地买不到某件商品,又或者是因为当地这件商品的价格比其他地区的贵,因此托人在其他地区甚至国外购买该商品,然后通过快递发货或者直接携带回来;还有一种代购,由于消费者对想要购买的商品相关信息的缺乏,自已无法确定其实际价值而又不想被商家宰,只好委托中介机构帮其讲价或为其代买。

在软件开发中,也有一种设计模式可以提供与代购类似的功能。由于某些原因,客户端无法直接访问某个对象或访问某个对象存在困难时,可以通过一个称之为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。

模式定义

代理模式(Proxy Pattern):给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

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

模式结构图

代理模式的结构比较简单,其核心是代理类,为了让客户端能够一致性地对待真实对象和代理对象,在代理模式中引入了抽象层,代理模式结构如下图所示:

代理模式(Proxy Pattern)——对象的间接访问

代理模式包含如下三个角色:

  • Subject(抽象主题角色):它声明了真实主题和代理主题的共同接口,这样一来在任何使用真实主题的地方都可以使用代理主题,客户端通常需要针对抽象主题角色进行编程。

  • Proxy(代理主题角色):它包含了对真实主题的引用,从而可以在任何时候操作真实主题对象;在代理主题角色中提供一个与真实主题角色相同的接口,以便在任何时候都可以替代真实主题;代理主题角色还可以控制对真实主题的使用,负责在需要的时候创建和删除真实主题对象,并对真实主题对象的使用加以约束。通常,在代理主题角色中,客户端在调用所引用的真实主题操作之前或之后还需要执行其他操作,而不仅仅是单纯调用真实主题对象中的操作。

  • RealSubject(真实主题角色):它定义了代理角色所代表的真实对象,在真实主题角色中实现了真实的业务操作,客户端可以通过代理主题角色间接调用真实主题角色中定义的操作。

模式伪代码

代理模式的结构图比较简单,但是在真实的使用和实现过程中要复杂很多,特别是代理类的设计和实现。

抽象主题类声明了真实主题类和代理类的公共方法,它可以是接口、抽象类或具体类,客户端针对抽象主题类编程,一致性地对待真实主题和代理主题,典型的抽象主题类代码如下:

public interface Subject {
    void request();
}

真实主题类实现了抽象主题类,提供了业务方法的具体实现,其典型代码如下:

public class RealSubject implements Subject {
    @Override
    public void request() {
        //业务方法具体实现代码
    }
}

代理类也是抽象主题类的子类,它维持一个对真实主题对象的引用,调用在真实主题中实现的业务方法,在调用时可以在原有业务方法的基础上附加一些新的方法来对功能进行扩充或约束,最简单的代理类实现代码如下:

public class Proxy implements Subject {
    // 维持一个对真实主题对象的引用
    private RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    public void preRequest() {
        // ...
    }

    public void postRequest() {
        // ...
    }

    @Override
    public void request() {
        preRequest();
        // 调用真实主题对象的方法
        realSubject.request();
        postRequest();
    }
}

模式应用

像上面代理类所实现的接口和所代理的方法都在代码中写死,被称之为静态代理。如果要为不同类的不同方法生成静态代理,代理类的数量将会发生爆炸。Java中也提供了对动态代理的支持。所谓动态代理(Dynamic Proxy),是指系统运行时动态生成代理类。

JDK中提供的动态代理只能代理一个或者多个接口,如果需要动态代理具体类或者抽象类,可以使用CGLib(Code Generation Library)等工具。CGLib是一个功能较为强大、性能也较好的代码生成包,在许多AOP框架中得到广泛应用。后面我会专门写一篇探究动态代理实现的博客,将全面细致地介绍动态代理。

补充:一文读懂Java中的动态代理

模式总结

代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。

主要优点

(1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

(2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

此外,不同类型的代理模式也具有独特的优点,例如:

(1) 远程代理为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。

(2) 虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。

(3) 缓冲代理为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。

(4) 保护代理可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限。

主要缺点

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

(2) 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。

适用场景

代理模式的类型较多,不同类型的代理模式有不同的优缺点,它们应用于不同的场合:

(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。

(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。

(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。

(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。

(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

CSCODE.NET开发框架文库 - C/S架构winform开发框架

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:GoF设计模式:桥接模式(Bridge Pattern)—处理多维度变化
下一篇:GoF设计模式:中介者模式(Mediator Pattern)—协调多个对象之间的交互
评论列表

发表评论

评论内容
昵称:
关联文章

GoF设计模式代理模式(Proxy Pattern)—对象间接访问
GoF设计模式访问模式(Visitor Pattern)—操作复杂对象结构
GoF设计模式:单例模式(Singleton Pattern)—确保对象唯一性
GoF设计模式:原型模式(Prototype Pattern)—对象克隆
GoF设计模式:工厂模式(Factory Pattern)
GoF设计模式:迭代器模式(Iterator Pattern)—遍历聚合对象元素
GoF设计模式:中介者模式(Mediator Pattern)—协调多个对象之间交互
GoF设计模式:享元模式(Flyweight Pattern)—实现对象复用
GoF设计模式:建造者模式(Builder Pattern)—复杂对象组装与创建
GoF设计模式:外观模式(Facade Pattern)—提供统一入口
GoF设计模式:职责链模式(Chain of Responsibility Pattern)—请求链式处理
GoF设计模式:组合模式(Composite Pattern)—树形结构处理
GoF设计模式:适配器模式(Adapter Pattern)—不兼容结构协调
GoF设计模式:装饰模式(Decorator Pattern)—扩展系统功能
GoF设计模式:命令模式(Command Pattern)—请求发送者与接收者解耦
GoF设计模式:桥接模式(Bridge Pattern)—处理多维度变化
C#设计模式应用-单件模式(Singleton Pattern)
SOAP 简单对象访问协议
设计模式 - 外观模式应用(Façade Pattern)
开发应用 - 策略模式(Strategy Pattern) 常用设计模式

热门标签
.NET5 .NET6 .NET7 APP Auth-软件授权注册系统 Axios B/S B/S开发框架 Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 DAL数据访问层 Database datalock DbFramework Demo教学 Demo下载 DevExpress教程 DOM EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS NavBarControl Node.JS NPM OMS ORM PaaS POS Promise API Redis SAP SEO SQL SQLConnector TMS系统 Token令牌 VS2022 VSCode VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 版本区别 报表 踩坑日记 操作手册 代码生成器 迭代开发记录 基础资料窗体 架构设计 角色权限 开发sce 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 秘钥 密钥 权限设计 软件报价 软件测试报告 软件简介 软件开发框架 软件开发平台 软件开发文档 软件体系架构 软件下载 软著证书 三层架构 设计模式 生成代码 实用小技巧 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序