首页 > 其他分享 >设计模式之代理模式

设计模式之代理模式

时间:2024-07-17 17:34:03浏览次数:15  
标签:真实 对象 代理 模式 访问 Proxy 设计模式 Subject

定义

代理模式(Proxy Pattern)是软件工程中的一种设计模式,它属于结构型模式,用于在不直接访问实际对象的情况下,通过一个或多个代理对象来间接访问某个对象或执行某些操作。

目的

这种模式的主要目的是:

  1. 控制访问:代理可以在访问真实对象之前或之后添加额外的操作,如权限检查、延迟初始化、日志记录等。
  2. 解耦依赖:代理模式允许将客户端与真实对象解耦,使得它们之间的依赖关系通过代理对象来间接实现。
  3. 增加灵活性:可以在不修改真实对象和客户端代码的情况下,通过代理添加或修改行为。

类型

代理模式(Proxy Pattern)是一种常见的设计模式,它为另一个对象提供一个代替或占位符,以控制对它的访问。代理模式可以在不修改原始对象的基础上,通过引入代理对象来添加额外的行为或延迟对象的创建。

代理模式有几种不同的类型,包括但不限于:

  1. 远程代理(Remote Proxy) :为远程对象(位于不同的地址空间)提供局部代表,隐藏对象位于不同地址空间的事实。
  2. 虚拟代理(Virtual Proxy) :延迟一个资源密集的对象的创建,直到真正需要它的时候。
  3. 保护代理(Protection Proxy) :控制对原始对象的访问,根据不同的访问权限提供不同的访问策略。
  4. 智能引用(Smart Reference) :在访问对象时执行额外的动作,比如引用计数、线程安全检查等。
  5. 缓存代理(Cache Proxy) :为结果提供缓存,加速数据访问。
  6. 防火墙代理(Firewall Proxy) :在网络层面控制对对象的访问,提供安全控制。
  7. 同步代理(Synchronous Proxy) :在多线程环境中,确保对象在同一时间只被一个线程访问。

优缺点

代理模式的优缺点如下:

优点:

  1. 对象访问控制:代理可以在访问真实对象之前进行权限检查,控制对敏感对象的访问。
  2. 延迟初始化:特别是对于虚拟代理,可以延迟对象的创建,直到真正需要时才进行初始化。
  3. 增加额外的功能:代理可以在不修改真实对象的情况下,通过在调用前后添加额外的逻辑来扩展对象的功能。
  4. 解耦依赖:代理模式允许客户端代码与真实对象解耦,客户端通过代理对象接口与真实对象交互,降低了组件之间的耦合度。
  5. 提高性能:通过远程代理,可以在本地执行某些操作,避免频繁的网络通信,提高系统性能。
  6. 保护真实对象:代理可以保护真实对象不被恶意访问或滥用,确保对象只承担其应该承担的责任。
  7. 代码复用:代理对象可以与多个真实对象关联,实现代码的复用。

缺点:

  1. 增加复杂性:引入代理对象会增加系统的设计复杂性,需要额外的代码来维护代理和真实对象的关系。
  2. 可能影响性能:代理对象的额外处理可能会引入延迟,尤其是在需要进行复杂逻辑处理时。
  3. 代理对象的透明度问题:如果代理对象没有实现Subject接口的所有方法,可能会导致代理对象的使用不如预期透明。
  4. 资源消耗:使用代理模式可能会消耗更多的资源,因为需要创建和维护代理对象。
  5. 难以处理所有情况:在某些情况下,代理可能难以处理真实对象的所有方法,特别是当真实对象接口发生变更时,代理对象也需要同步更新。
  6. 调试困难:由于代理模式引入了间接层,调试时可能难以追踪问题。
  7. 代理模式的不适用性:对于一些不需要控制访问或延迟初始化的对象,使用代理模式可能是一种过度设计。

代理模式是一种强大的设计模式,但应当在适当的场景下使用,以确保它带来的好处大于其引入的复杂性和潜在的性能开销。

结构

代理模式通常包含以下角色:

  • Subject:定义了真实对象和代理对象的共同接口,这样代理对象可以在任何真实对象出现的地方使用。
  • Real SubjectTarget:定义了代理所代表的真实对象,包含实际的业务逻辑。
  • Proxy:包含对真实对象的引用,并提供与真实对象相同的接口。代理对象在访问真实对象之前或之后可以添加额外的行为。

类图

以下是使用Mermaid语法绘制的上述代码的UML类图:

classDiagram class Subject { <<Interface>> +performTask() } class RealSubject { + performTask() : void } class Proxy { - realSubject : RealSubject + performTask() : void } class Client { - subject : Subject } Proxy ..|> Subject : Implements RealSubject ..|> Subject : Implements Client ..> Subject : Use

在这个UML类图中:

  • Subject​ 是一个接口,定义了 performTask()​ 方法。
  • RealSubject​ 是一个类,实现了 Subject​ 接口及其 performTask()​ 方法。
  • Proxy​ 是一个类,也实现了 Subject​ 接口。它包含一个 RealSubject​ 类型的私有成员变量 realSubject​,以及自己的 performTask()​ 方法实现。在 performTask()​ 方法中,如果 realSubject​ 为 null​,则创建 RealSubject​ 实例。然后,代理在调用真实对象的 performTask()​ 方法前后执行额外的操作。

示例代码

代理模式的实现通常涉及到以下几个角色:

  • Subject: 定义了真实对象和代理对象的共同接口。
  • Real Subject: 定义了代理所代表的真实对象。
  • Proxy: 包含对真实对象的引用,并在与真实对象交互前后可以添加额外的操作。

以下是一个简单的代理模式Java代码示例:

// 定义了真实对象和代理对象的接口
interface Subject {
    void performTask();
}

// 真实对象
class RealSubject implements Subject {
    @Override
    public void performTask() {
        System.out.println("RealSubject is performing the task.");
    }
}

// 代理对象
class Proxy implements Subject {
    private RealSubject realSubject;

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

    public void performTask() {
        if (this.realSubject == null) {
            this.realSubject = new RealSubject();
        }
        // 在访问真实对象之前添加额外的操作
        System.out.println("Proxy preparing RealSubject for the task.");
        this.realSubject.performTask();
        // 在访问真实对象之后添加额外的操作
        System.out.println("Proxy finalizing after task.");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Subject subject = new Proxy();
        subject.performTask();
    }
}

在这个例子中,Proxy​类在调用RealSubject​之前和之后添加了额外的输出操作,演示了如何在不修改原始对象的情况下,通过代理添加额外的行为。代理模式非常适用于需要控制对象访问、延迟对象创建、或者为对象添加额外功能的场景。

应用场景

代理模式在软件开发中有许多应用场景,以下是一些常见的例子:

  1. 远程代理:当需要与远程对象(如Web服务)交互时,可以使用代理来隐藏对象位于不同地址空间的事实。
  2. 虚拟代理:当创建一个对象需要消耗大量资源时(例如,加载大型图像或文档),可以使用虚拟代理来延迟对象的创建,直到它真正需要被使用。
  3. 保护代理:当需要控制对原始对象的访问时,可以使用保护代理来检查调用者是否有权限执行某些操作。
  4. 智能引用:在内存管理或对象引用计数的场景中,智能引用代理可以在对象被引用或释放时执行额外的操作。
  5. 缓存代理:为结果提供缓存,加速数据访问。如果对象的创建是昂贵的,缓存代理可以存储结果以便快速访问。
  6. 防火墙代理:在网络安全领域,防火墙代理可以控制对特定资源的访问,提供访问控制和安全检查。
  7. 同步代理:在多线程环境中,同步代理确保对象在同一时间只被一个线程访问,从而避免竞态条件。
  8. 延迟初始化:当对象的初始化依赖于一些不确定或昂贵的条件时,可以使用代理来延迟初始化过程。
  9. 日志记录和监控:代理可以在调用真实对象的方法前后添加日志记录或性能监控代码。
  10. 事务管理:在需要事务控制的场景中,代理可以在方法调用前后添加事务开始和提交或回滚的逻辑。
  11. 访问对象的限流:代理可以控制对某些资源的访问频率,例如API调用的限流。
  12. 实现功能扩展:通过代理可以在不修改原有对象的基础上,动态地添加额外的功能。
  13. 网络资源访问:当访问网络资源时,代理可以在本地缓存数据,减少网络请求。
  14. 图形用户界面(GUI) :在GUI编程中,代理模式可以用于实现命令的撤销和重做功能。
  15. 装饰者模式的替代:在某些情况下,代理模式可以作为装饰者模式的替代,用于动态地添加额外的职责。

代理模式的核心优势是它提供了一种灵活的方式来扩展或修改对象的行为,而不需要改变对象本身的代码。这有助于遵循开闭原则(对扩展开放,对修改封闭)。


参考文档

Kimi.ai - 帮你看更大的世界

设计模式之代理模式(Proxy)详解及代码示例 - kosamino - 博客园

标签:真实,对象,代理,模式,访问,Proxy,设计模式,Subject
From: https://www.cnblogs.com/booleandev/p/18307899/proxy-mode-21myrw

相关文章

  • NB-IoT工作模式
    NB-IOT工作模式1.介绍①无需移动性,大数据量(上行),需较宽频段,比如城市监控摄像头。②移动性强,需执行频繁切换,小数据量,比如车队追踪管理。③无需移动性,小数据量,对时延不敏感,比如智能抄表。NB-IoT正是为了应对第③种物联网设备而生。2.特点(1)优点超强覆盖:相对GPRS来说,增加20db的......
  • EFCore -CodeFirst模式 数据库使用SqLite
    首先安装nuget包:System.Data.SQLite和SQLite.CodeFirst,如下二图:然后在App.config中配置数据库连接字符串:<connectionStrings><addname="StuDB"connectionString="datasource=BoilerCalculator.db"providerName="System.Data.SQLite.EF6"/&......
  • 特例模式与空对象模式
    特例模式指的是为处理某些特殊情况而创建的特殊类或对象。这些类或对象专门用于处理特定的异常情况或边界条件,以便简化主业务逻辑的处理。应用场景:用于需要处理某些特殊输入、边界条件或错误情况的场景。例如,处理数据库查询时,返回一个特例对象表示没有找到数据。空对象模式通过......
  • 《分析模式》漫谈10-白头神探
    100:00:01,120-->00:00:05,320前言里面,就紧接着昨天的视频200:00:05,880-->00:00:07,110紧接着上一个视频300:00:08,050-->00:00:09,490下来就有这么一段话400:00:09,500-->00:00:11,710他说theappendixis500:00:11,720-->00:00:12,590notdesigned......
  • 设计模式之工厂模式(学习笔记)
    定义工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类来决定实例化哪一个类。工厂方法使得类的实例化延迟到子类,这样可以让客户端在不需要知道具体类的情况下创建对象。工厂方法模式通过使用继承和多态性,允许子类来控制对象的创建方式,能够更好地应对对象......
  • 动态IP线路的深度价值与代理服务测评
    在这个网络世界日益复杂多变的今天,动态IP线路以其多样的优势,成为了众多网络活动参与者手中的一把利器。作为测评团队,我们深知在海量信息中筛选出真正有价值的资源对于每一位用户的重要性。因此,本文旨在深入探讨动态IP线路的核心价值,并通过详尽分析两家顶尖服务商——品易HTTP与......
  • 设计模式-C#实现简单工厂模式
    前言上一篇文章写了如何使用RabbitMQ做个简单的发送邮件项目,然后评论也是比较多,也是准备去学习一下如何确保RabbitMQ的消息可靠性,但是由于时间原因,先来说说设计模式中的简单工厂模式吧!在了解简单工厂模式之前,我们要知道C#是一款面向对象的高级程序语言。它有3大特性,封装、继承、......
  • 正反向代理与负载均衡
    3、正反向代理与负载均衡3.1正向代理(ForwardProxy)工作原理:1、正向代理位于客户端和原始服务器之间,为客户端发送请求到目标服务器进行代理。客户端不直接访问目标服务器,而是通过正向代理来访问。2、客户端向正向代理发送请求,然后正向代理将这些请求转发给目标服务器,并将......
  • 装饰器模式
    装饰器模式(DecoratorPattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式通过将对象包装在装饰器类中,以便动态地修改其行为。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完......
  • 设计模式之简单工厂模式(学习笔记)
    定义简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,它定义一个用于创建对象的接口,但由一个单独的类来实现实际创建的工作。简单工厂模式通过在一个类中集中管理对象的创建过程,可以减少客户端与具体类之间的耦合,使得代码结构更加清晰和易于维护。通过专门定义一个类来负......