软件设计模式系列之十四——代理模式

这篇具有很好参考价值的文章主要介绍了软件设计模式系列之十四——代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 模式的定义

代理模式是一种结构型设计模式,它允许一个对象(代理)充当另一个对象的接口,以控制对该对象的访问。代理模式通常用于控制对真实对象的访问,以实现一些额外的功能,例如延迟加载、权限控制、日志记录等。这种模式属于结构型设计模式,因为它关注对象之间的组合,以形成更大的结构。

代理模式有多种类型,包括静态代理和动态代理。静态代理在编译时创建代理对象,而动态代理在运行时创建代理对象。代理模式的核心思想是通过引入一个代理对象来控制对真实对象的访问,从而实现额外的功能,而不必修改真实对象的代码。

2 举例说明

为了更好地理解代理模式,让我们看几个日常生活中的简单示例。
一个最典型的例子就是狐假虎威,狐狸就做了老虎的代理。
软件设计模式系列之十四——代理模式

银行代理。在银行业务中,某些操作需要前往银行分行才能完成,但人们不一定都会前往分行。因此,银行通常设立代理机构,例如ATM(自动取款机)和在线银行,允许客户在不必亲自前往分行的情况下进行银行业务。

网络代理。防火墙和代理服务器是网络中常见的代理示例。防火墙代理可以过滤和控制网络流量,而代理服务器可以缓存和优化网络请求,提高网络性能。
软件设计模式系列之十四——代理模式

租房中介。在房地产市场中,房屋租赁中介机构充当租客和房东之间的代理。中介机构帮助租客找到合适的房源,同时为房东管理租赁过程,收取一定的服务费。

电影票代理。在线电影票代理网站允许观众在不必亲自前往电影院的情况下购买电影票。这些代理网站提供了方便的在线订票和座位选择功能。

社交媒体代理。在社交媒体上,一些名人或公众人物可能雇佣社交媒体代理来管理他们的社交媒体账户。这些代理负责发布内容、与粉丝互动,以代表名人或公众人物维护其在线存在。

这些示例都展示了代理模式的核心思想:允许一个对象(代理)充当另一个对象(真实对象)的接口,以控制对真实对象的访问,同时可以添加额外的功能或服务。这种模式在日常生活中有着广泛的应用,以提供更便利的服务和更好的控制。

3 结构

代理模式的结构包括以下几个关键部分:
软件设计模式系列之十四——代理模式

Subject(主题):定义了真实对象和代理对象的共同接口,以确保代理对象可以替代真实对象。在示例中,ImageLoader 就是主题。

RealSubject(真实主题):代表真实对象,它是实际执行工作的类。在示例中,ImageLoader 是真实主题。

Proxy(代理):充当了真实主题的代理,实现了与真实主题相同的接口。它可以在执行任务前后添加额外的功能。在示例中,ImageLoaderProxy 是代理。

4 实现步骤

实现代理模式时,通常遵循以下步骤:

定义主题接口(Subject):这个接口应该包含真实主题和代理类都必须实现的方法。

创建真实主题类(RealSubject):这个类负责执行实际的工作,实现主题接口的方法。

创建代理类(Proxy):代理类实现了主题接口,并包含一个对真实主题对象的引用。它可以在调用真实主题的方法前后添加额外的逻辑。

在客户端代码中使用代理:客户端代码不直接与真实主题交互,而是通过代理对象来访问真实主题。

5 代码实现

假设我们有一个图像加载器类 ImageLoader,它负责从磁盘或网络加载图像并显示在界面上。现在,我们想要在加载图像之前检查用户的权限以确保他们有权查看该图像。

在这个示例中,我们可以创建一个代理类 ImageLoaderProxy,它充当了 ImageLoader 的接口。在代理类中,我们可以添加权限检查的逻辑,然后再调用真实的 ImageLoader 对象来加载图像。

// 1. 定义主题接口
interface ImageLoader {
    void displayImage();
}

// 2. 创建真实主题类
class RealImageLoader implements ImageLoader {
    private String image;

    public RealImageLoader(String image) {
        this.image = image;
    }

    @Override
    public void displayImage() {
        System.out.println("Displaying image: " + image);
    }
}

// 3. 创建代理类
class ImageLoaderProxy implements ImageLoader {
    private RealImageLoader realImageLoader;
    private String image;
    private String user;

    public ImageLoaderProxy(String image, String user) {
        this.image = image;
        this.user = user;
    }

    @Override
    public void displayImage() {
        // 在调用真实主题前检查用户权限
        if (user.equals("admin")) {
            realImageLoader = new RealImageLoader(image);
            realImageLoader.displayImage();
        } else {
            System.out.println("Access denied. You do not have permission to view this image.");
        }
    }
}

// 4. 在客户端代码中使用代理
public class Client {
    public static void main(String[] args) {
        ImageLoader imageLoader = new ImageLoaderProxy("image.jpg", "admin");
        imageLoader.displayImage();

        ImageLoader imageLoader2 = new ImageLoaderProxy("image.jpg", "user");
        imageLoader2.displayImage();
    }
}

6 典型应用场景

代理模式在软件开发中有许多典型的应用场景,包括但不限于:

虚拟代理(Virtual Proxy):延迟加载。用于延迟加载大型资源,例如图像或文件,以提高性能。虚拟代理只在需要时加载真实对象,而不是在初始化时加载。
软件设计模式系列之十四——代理模式

远程代理(Remote Proxy):远程服务访问。用于通过网络访问远程对象,隐藏了底层的网络通信细节。客户端可以像调用本地对象一样访问远程对象。

保护代理(Protection Proxy):权限控制。用于控制对对象的访问,确保只有合适的用户或客户端可以访问真实对象。通常用于实现身份验证和授权。

缓存代理(Cache Proxy):缓存管理。用于在访问对象之前检查缓存,以提高性能。如果请求的数据已存在于缓存中,代理会返回缓存的数据而不是重新加载。

日志记录代理(Logging Proxy):用于在调用真实对象的方法前后添加日志记录,以监控和记录系统行为。

动态代理(Dynamic Proxy):运行时代理。用于在运行时创建代理对象,通常通过Java的反射机制实现。动态代理可以实现通用的代理逻辑,而不需要为每个接口或对象单独创建代理类。

这些应用场景和功能分类展示了代理模式的灵活性和多样性。根据具体的需求和情况,可以选择使用代理模式的不同变体来实现所需的功能,从而提高代码的可维护性和灵活性

7 优缺点

优点:
控制访问:代理模式允许你控制对真实对象的访问,可以添加额外的逻辑来满足特定需求,如权限控制、日志记录等。

提高性能:虚拟代理和缓存代理可以提高性能,延迟加载和缓存对象可以减少不必要的资源消耗。

松耦合:代理模式可以将客户端与真实对象解耦,客户端不需要直接访问真实对象,从而降低了耦合度。

安全性:代理模式可以用于实现安全性控制,确保只有符合条件的用户或客户端可以访问真实对象。
缺点:
复杂性增加:引入代理对象可能会增加代码复杂性,特别是在涉及多个代理层的情况下。

性能开销:在一些情况下,代理模式可能引入性能开销,特别是在创建代理对象的开销较大时。

8 类似模式

与代理模式类似的模式包括装饰器模式和适配器模式。这些模式与代理模式有一些相似之处,但它们各自有不同的目的和应用场景。

装饰器模式(Decorator Pattern)

装饰器模式的主要目的是动态地为对象添加额外的功能,而不改变其接口。它通过将对象包装在装饰器类中来实现这一点。代理模式和装饰器模式都允许你包装对象并添加额外的功能。它们都通过组合实现,都有一个共同的接口,但其关注点不同。代理模式关注于控制访问和添加额外逻辑,而装饰器模式关注于动态添加功能,但不改变接口。

适配器模式(Adapter Pattern)

适配器模式的主要目的是将一个接口转换为另一个接口,以便两个不兼容的接口可以协同工作。它通常涉及到两个已存在的接口之间的适配。代理模式和适配器模式都涉及到包装对象。然而,代理模式主要关注于控制对真实对象的访问,而适配器模式主要关注于接口的转换。

9 小结

代理模式是一种有用的设计模式,用于控制对真实对象的访问并添加额外的功能。它在许多应用场景中都有广泛的用途,包括权限控制、延迟加载、性能优化等。通过引入代理对象,可以实现松耦合的设计,使系统更加灵活和可维护。然而,代理模式也需要谨慎使用,因为不当使用可能会引入复杂性和性能开销。在实际开发中,要根据具体需求和场景来选择是否使用代理模式以及何种类型的代理模式。希望本文能够帮助你更好地理解代理模式的概念和应用。文章来源地址https://www.toymoban.com/news/detail-710092.html

到了这里,关于软件设计模式系列之十四——代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件设计模式系列之十五——职责链模式

    职责链模式(Chain of Responsibility Pattern)也称为责任链模式,是一种结构型设计模式,用于构建一条对象处理请求的责任链。在这个模式中,多个对象依次处理请求,直到其中一个对象能够处理该请求为止。职责链模式将请求的发送者和接收者解耦,允许多个对象都有机会处理

    2024年02月08日
    浏览(35)
  • 软件设计模式系列之十八——迭代器模式

    迭代器模式是一种行为型设计模式,它允许客户端逐个访问一个聚合对象中的元素,而不暴露该对象的内部表示。迭代器模式提供了一种统一的方式来遍历不同类型的集合,使客户端代码更加简洁和可复用。 为了更好地理解迭代器模式,让我们考虑一个简单的例子:一个图书

    2024年02月08日
    浏览(43)
  • 软件设计模式系列之十三——享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少内存占用或计算开销,通过共享大量细粒度对象来提高系统的性能。这种模式适用于存在大量相似对象实例,但它们的状态可以外部化(extrinsic),并且可以在多个对象之间共享的情况。 为了更好地理解享元模式

    2024年02月08日
    浏览(52)
  • 软件设计模式系列之十九——中介者模式

    @ 目录 1 模式的定义 2 举例说明 3 结构 4 实现步骤 5 代码实现 6 典型应用场景 7 优缺点 8 类似模式 9 小结 中介者模式是一种行为型设计模式,它用于降低对象之间的直接通信,通过引入一个中介者对象来管理对象之间的交互。这种模式有助于减少对象之间的耦合性,使系统更

    2024年02月08日
    浏览(42)
  • 软件设计模式系列之十七——解释器模式

    解释器模式是一种行为型设计模式,它用于将一种语言或表达式解释为对象。该模式通过定义语言的文法规则,并使用解释器来解释和执行这些规则,将复杂的语言转换为对象的操作。 在软件开发中,解释器模式常用于处理类似于编程语言、查询语言、正则表达式等需要解释

    2024年02月08日
    浏览(32)
  • 软件设计模式系列之二十四——模板方法模式

    在软件设计领域,设计模式是一组被反复使用、多次实践验证的经典问题解决方案。其中,模板方法模式是一种行为型设计模式,用于定义一个算法的骨架,将算法中的某些步骤延迟到子类中实现,从而使子类可以重新定义算法的某些特定步骤,同时保持算法的整体结构不变

    2024年02月08日
    浏览(43)
  • 软件工程(十四) 设计模式之结构型模式(二)

    简要说明 将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 速记 树形目录结构 类图如下 由类图其实可以看出,组合模式就是将具有父子关系的结构,组装形成一棵树,并且根据规范,树干节点和叶子节点均

    2024年02月11日
    浏览(39)
  • 结构型设计模式之代理模式【设计模式系列】

    C++技能系列 Linux通信架构系列 C++高性能优化编程系列 深入理解软件架构设计系列 高级C++并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月16日
    浏览(48)
  • 软件设计模式系列之七——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和

    2024年02月08日
    浏览(46)
  • 软件设计模式系列之九——桥接模式

    桥接模式是一种结构型设计模式,它用于将抽象部分与其实现部分分离,以便它们可以独立地变化。这种模式涉及一个接口,它充当一个桥,使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系,从而减少类之间的紧密耦合度,使得系统更

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包