设计模式-代理模式

代理模式:

代理模式(Proxy Pattern)是属于结构型的设计模式,它为其他对象提供一个代理通过它间接返回目标对象。代理模式通过引入一个中间层(代理类),在客户端和目标对象之间进行解耦。

角色和结构:

1 Subject(抽象主题)

  • 定义了真实主题和代理对象共有的接口, 方便在任何使用真实主题的地方都可以使用代理。
  • 通常是一个抽象类或接口,声明了真实主题和代理所要实现的方法。

2 RealSubject(真实主题)

  • 实现了 Subject 接口的实际对象,包含了核心业务逻辑。
  • 是最终被代理对象引用的对象。

3 Proxy(代理)

  • 同样实现了 Subject 接口,因此在外部看来与真实主题是一样的。
  • 内部持有对真实主题的引用,在调用方法时可以选择直接调用真实主题的方法,或者在调用前后添加额外的操作。

工作原理:

  • 客户端不直接操作真实主题,而是通过代理对象间接访问。
  • 代理对象在执行代理方法时,可以根据需要决定何时以及如何调用真实主题的方法,甚至可以在不调用真实主题的情况下完成请求。

示例代码:

java 复制代码
// 抽象主题
public interface Image {
    void display();
}

// 真实主题
public class RealImage implements Image {
    private String filename;

    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk(); // 加载图像文件到内存
    }

    private void loadFromDisk() {
        // 加载实际图像数据的代码...
        System.out.println("Loading image from disk: " + filename);
    }

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

// 代理
public class ProxyImage implements Image {
    private String filename;
    private RealImage realImage;

    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 proxyImage = new ProxyImage("large.jpg");
        proxyImage.display(); // 第一次会加载图像
        proxyImage.display(); // 第二次直接显示,不再重新加载
    }
}

说明:在上面代码中的RealImage 类是真实主题,而 ProxyImage 类作为代理,当第一次调用 display() 方法时,它才会真正加载图像文件,后续调用则直接显示已加载的图像,从而优化了性能并展示了代理模式的应用场景。

应用场景:

  • 虚拟代理:在需要开销较大的资源时才创建真实对象,节省系统资源,例如图片懒加载、数据库连接池中的代理对象。
  • 保护代理:控制对原始对象的访问,如根据用户权限决定是否允许访问某些资源。

优点:

  • 封装与隔离:保护目标对象,隐藏具体实现细节。
  • 控制访问:代理可以控制对真实对象的访问权限,比如在访问前进行权限检查。
  • 智能透明代理:客户端无需了解是与真实对象还是代理对象交互,增强了系统的灵活性。
  • 扩展功能:在调用真实对象之前或之后增加自定义功能,例如缓存、事务管理、日志记录等。
相关推荐
Cosolar2 小时前
提示词工程面试题系列 - Zero-Shot Prompting 和 Few-Shot Prompting 的核心区别是什么?
人工智能·设计模式·架构
geovindu8 小时前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
钝挫力PROGRAMER8 小时前
贫血模型的改进
java·开发语言·设计模式·架构
qcx2310 小时前
Warp源码深度解析(二):自研GPU UI框架——WarpUI的ECH模式与渲染管线
人工智能·ui·设计模式·rust
qcx2311 小时前
Warp源码深度解析(三):Block-Based终端引擎——Grid模型、PTY与Shell Integration
人工智能·设计模式·架构·wrap
mounter62512 小时前
Linux Kernel Design Patterns (Part 2):从经典链表到现代 XArray,拆解内核复杂数据结构的设计哲学
linux·数据结构·链表·设计模式·内存管理·kernel
rrr212 小时前
【PyQt5】| 多线程设计模式
开发语言·qt·设计模式
SteveDraw12 小时前
常见的设计模式及工业场景下应用(更新中)
设计模式·c#·编码规范·gof23
ximu_polaris12 小时前
设计模式(C++)-行为型模式-状态模式
c++·设计模式·状态模式
ximu_polaris12 小时前
设计模式(C++)-行为型模式-迭代器模式
c++·设计模式·迭代器模式