哇塞码农设计模式系列 -- 代理模式

更新于2024-11-05 08:01:005 分钟2 千字203994800
摘要

代理模式

代理模式是一种结构型设计模式,它允许你提供一个代理或者占位符来控制对其他对象的访问。

在代理模式中,有三个主要角色:

  1. Subject(主题):定义了 RealSubject 和 Proxy 的共同接口,客户端通过这个接口访问 RealSubject。
  2. RealSubject(真实主题):实现了 Subject 接口,是代理模式中真正执行业务逻辑的对象。
  3. Proxy(代理):实现了 Subject 接口,并保存了一个对 RealSubject 对象的引用。Proxy 控制对 RealSubject 对象的访问,并在必要时创建、初始化或执行其他操作。

UML类图

PlantUML Image

Java代码示例

// Subject 接口
interface Subject {
    void request();
}

// RealSubject 类
class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("RealSubject: Handling request.");
    }
}

// Proxy 类
class Proxy implements Subject {
    private RealSubject realSubject;

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

    @Override
    public void request() {
        // 在调用真实主题之前可以执行一些额外的操作
        System.out.println("Proxy: Handling request before delegating to RealSubject.");
  
        // 委托给真实主题处理请求
        realSubject.request();
  
        // 在调用真实主题之后可以执行一些额外的操作
        System.out.println("Proxy: Handling request after delegating to RealSubject.");
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 创建真实主题对象
        RealSubject realSubject = new RealSubject();
  
        // 创建代理对象,并将真实主题对象传递给代理
        Proxy proxy = new Proxy(realSubject);
  
        // 通过代理对象发起请求
        proxy.request();
    }
}

适用场景

代理模式适用于以下场景:

  1. 远程代理:当需要在客户端和远程对象之间进行通信时,可以使用远程代理。远程代理负责处理网络通信和数据传输,客户端通过远程代理来访问远程对象,而无需了解具体的网络细节。
  2. 虚拟代理:当对象创建开销较大,或者需要延迟加载时,可以使用虚拟代理。虚拟代理延迟创建或初始化真实对象,直到客户端真正需要使用它。
  3. 保护代理:当需要控制对对象的访问权限时,可以使用保护代理。保护代理根据客户端的访问权限来决定是否允许访问真实对象,从而保护真实对象的安全性。
  4. 缓存代理:当需要缓存对象的计算结果时,可以使用缓存代理。缓存代理在请求到达时检查是否已经有缓存的结果,如果有,则直接返回缓存结果,否则委托给真实对象计算并缓存结果。
  5. 日志记录:当需要记录对象的操作日志时,可以使用日志记录代理。日志记录代理在调用真实对象之前或之后记录相关操作,从而实现日志记录的功能。

总的来说,代理模式适用于需要在客户端和真实对象之间添加额外的功能或控制访问权限的场景。代理模式可以提高系统的灵活性、安全性和性能。

评论区

你认为这篇文章怎么样?
  • great
    0
  • happy
    0
  • doubt
    0
  • boring
    0
  • bad
    0

0/2048