设计模式7-代理模式

本文介绍了代理模式作为一种结构型设计模式,包括抽象主题、真实主题和代理的角色,以及远程代理、虚拟代理、保护代理和智能代理的不同类型。通过一个Java示例展示了如何在实际场景中应用代理模式控制对象访问和资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 概念   

代理模式是一种结构型设计模式,其目的是通过引入一个代理对象来控制对另一个对象的访问。

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

  1. 抽象主题(Subject):声明了代理和真实主题之间的共同接口,这样代理对象可以替代真实主题。
  2. 真实主题(Real Subject):定义了代理所代表的真实对象。
  3. 代理(Proxy):保持一个引用,使得代理可以访问真实主题,并提供与真实主题相同的接口,以便可以替代真实主题。

类型

代理模式可以分为几种类型,包括:

  • 远程代理(Remote Proxy):控制对远程对象的访问,即使这些对象位于不同的地址空间。
  • 虚拟代理(Virtual Proxy):控制对创建开销大的资源的访问,直到真正需要它们。
  • 保护代理(Protection Proxy):基于调用者的身份控制对对象的访问权限。
  • 智能代理(Smart Proxy):在访问对象时执行额外的动作,例如对对象的引用计数或懒加载。

2. 示例

// 抽象主题
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 ProxyPatternExample {
    public static void main(String[] args) {
        Image image = new ProxyImage("test.jpg");

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

        // 图像不需要从磁盘加载
        image.display();
    }
}

 在上面的示例中,ProxyImage 充当了 RealImage 的代理。它会在需要时创建 RealImage,并控制对 RealImage 对象的访问。第一次调用 display() 时,会实际加载图像,而后续调用将直接使用已加载的图像。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值