java 实现代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它允许一个对象(代理对象)充当另一个对象(被代理对象)的接口,以控制对该对象的访问。代理模式通常用于以下情况:

  1. 远程代理:代理对象在不同的地址空间中,可以代理远程对象的访问。
  2. 虚拟代理:代理对象用于控制创建昂贵对象的方式,只有在需要时才创建真正的对象。
  3. 保护代理:代理对象用于控制对另一个对象的访问权限。
  4. 智能代理:代理对象用于在访问另一个对象时添加额外的功能,如引用计数、懒加载等。

在Java中,代理模式通常通过创建代理类来实现。以下是一个简单的Java示例,演示如何实现代理模式:

首先,定义一个接口 Image,表示被代理对象的接口:

java 复制代码
public interface Image {
    void display();
}

然后,创建一个具体的类 RealImage,实现了 Image 接口:

java 复制代码
public class RealImage implements Image {
    private String filename;

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

    private void loadFromDisk() {
        System.out.println("Loading image: " + filename);
    }

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

接下来,创建一个代理类 ProxyImage,也实现了 Image 接口,但在 display 方法中控制对 RealImage 对象的访问:

java 复制代码
public 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();
    }
}

现在,我们可以使用代理模式来控制对图像对象的访问:

java 复制代码
public class ProxyPatternDemo {
    public static void main(String[] args) {
        // 创建代理对象
        Image image = new ProxyImage("image.jpg");

        // 第一次访问,加载并显示图像
        image.display();

        // 第二次访问,不需要重新加载,直接显示图像
        image.display();
    }
}

在这个示例中,ProxyImage 作为代理对象控制了对 RealImage 对象的访问。如果图像已经加载过,代理对象不会重新加载图像,而是直接显示图像。这种方式可以提高性能并延迟对象的创建(虚拟代理)。

代理模式是一种非常有用的设计模式,它可以帮助控制对对象的访问,并添加额外的功能。在实际应用中,代理模式可以用于实现缓存、延迟加载、安全控制等方面。

相关推荐
2601_949146534 分钟前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术15 分钟前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学21 分钟前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于JavaWeb的网上家具商城设计与实现为例,包含答辩的问题和答案
java
mftang2 小时前
Python 字符串拼接成字节详解
开发语言·python
jasligea2 小时前
构建个人智能助手
开发语言·python·自然语言处理
kokunka2 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏
C雨后彩虹2 小时前
CAS与其他并发方案的对比及面试常见问题
java·面试·cas·同步·异步·
云栖梦泽3 小时前
易语言开发从入门到精通:补充篇·网络编程进阶+实用爬虫开发·API集成·代理IP配置·异步请求·防封禁优化
开发语言
java1234_小锋3 小时前
Java高频面试题:SpringBoot为什么要禁止循环依赖?
java·开发语言·面试