欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 代理模式详解

代理模式详解

2025/5/3 14:12:19 来源:https://blog.csdn.net/silver687/article/details/144950879  浏览:    关键词:代理模式详解

代理模式(Proxy Pattern)是一种常用的设计模式,它提供了一个代理对象来控制对另一个对象的访问。以下是代理模式的详细介绍:
1. 定义
代理模式是一种结构型设计模式,它允许一个代理对象来代表另一个对象(真实对象)执行操作。代理对象可以控制对真实对象的访问,或者在访问真实对象之前和之后执行一些附加操作。
2. 结构
代理模式通常包含以下三个主要角色:
•  Subject(抽象主题):定义了代理对象和真实对象的共同接口,使得代理对象可以像真实对象一样被使用。
•  RealSubject(真实主题):实现了抽象主题接口,提供实际的业务逻辑。
•  Proxy(代理):实现了抽象主题接口,控制对真实主题的访问,并可以在访问真实主题之前和之后执行一些附加操作。
3. 类图
classDiagram
    class Subject {
        <<interface>>
        +request()
    }
    class RealSubject {
        +request()
    }
    class Proxy {
        -subject
        +request()
    }
    Subject <|-- RealSubject
    Subject <|-- Proxy
    Proxy --> RealSubject: contains

4. 代理模式的类型
代理模式有多种类型,常见的有以下几种:
•  远程代理:用于代理对远程对象的调用,例如在分布式系统中,客户端通过代理对象调用远程服务器上的对象。
•  虚拟代理:用于创建一个资源密集型对象的虚拟代理,例如在图像处理中,先创建一个图像的代理对象,当需要显示图像时,再加载图像数据。
•  保护代理:用于控制对真实对象的访问权限,例如在用户管理中,只有具有特定权限的用户才能访问某些对象。
•  缓存代理:用于缓存对象的状态,避免重复计算或访问数据库,提高系统性能。
•  智能引用代理:用于在对象被引用时执行一些附加操作,例如在对象被删除时执行清理操作。
5. 优缺点
•  优点:
•  控制访问:代理对象可以控制对真实对象的访问,例如在保护代理中,可以限制只有具有特定权限的用户才能访问某些对象。
•  增强功能:代理对象可以在访问真实对象之前和之后执行一些附加操作,例如在虚拟代理中,可以在加载图像数据之前先检查图像是否存在。
•  延迟初始化:代理对象可以在需要时才创建真实对象,例如在虚拟代理中,可以在图像需要显示时才加载图像数据。
•  缺点:
•  复杂性增加:引入代理对象会增加系统的复杂性,需要更多的代码来实现代理模式。
•  性能开销:代理对象需要在访问真实对象之前和之后执行一些附加操作,可能会增加系统的性能开销。
6. 实例
假设有一个Image类,表示一个图像对象,加载图像数据需要花费很长时间。我们可以使用代理模式来优化这个过程。
// 抽象主题接口
interface Image {
    void display();
}

// 真实主题类
class RealImage implements Image {
    private String fileName;

    public RealImage(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }

    @Override
    public void display() {
        System.out.println("Displaying " + fileName);
    }

    private void loadFromDisk(String fileName) {
        System.out.println("Loading " + fileName);
    }
}

// 代理类
class ProxyImage implements Image {
    private RealImage realImage;
    private String fileName;

    public ProxyImage(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void display() {
        if (realImage == null) {
            realImage = new RealImage(fileName);
        }
        realImage.display();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Image image = new ProxyImage("test_10mb.jpg");

        // 图像将从磁盘加载
        image.display();

        // 图像不会重新加载
        image.display();
    }
}

在这个例子中,ProxyImage类是代理对象,它实现了Image接口。当调用display方法时,如果realImage对象不存在,它会创建一个RealImage对象并加载图像数据。如果realImage对象已经存在,它会直接调用realImage的display方法。这样可以避免在每次调用display方法时都加载图像数据,提高系统的性能。
代理模式是一种非常实用的设计模式,适用于需要控制对对象的访问、增强功能或延迟初始化等场景。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词