侧边栏壁纸
博主头像
人生短短几个秋

行动起来,活在当下

  • 累计撰写 45 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

设计模式-代理模式

人生短短几个秋
2025-01-25 / 0 评论 / 0 点赞 / 13 阅读 / 0 字

设计模式 - 代理模式(Proxy Pattern)

介绍

代理模式是一种结构型设计模式,它为你提供了一个代理对象来控制对真实对象的访问。代理对象通常包含对真实对象的引用,这样它可以透明地传递请求到真实的对象。此外,代理对象也可以用来执行一些额外的工作,例如缓存、权限检查等。

实现

我们以一个图像加载器为例来展示代理模式的应用。假设我们需要在应用程序中加载大量的图像文件,为了减少内存消耗,我们希望在真正需要显示图像时才加载它。

定义主题接口

首先定义一个主题接口,它声明了所有代理和真实对象共有的方法。

interface Image {
    void display();
}

创建真实主题类

然后创建一个真实主题类,它实现了 Image 接口,并提供了真实的图像加载逻辑。

class RealImage implements Image {
    private final String filename;

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

    private void loadFromDisk(String filename) {
        System.out.println("Loading image from disk: " + filename);
        // Simulate loading time
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

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

创建代理类

接着创建一个代理类,它也实现了 Image 接口,并持有对真实主题的引用。

class ImageProxy implements Image {
    private RealImage realImage;
    private final String filename;

    public ImageProxy(String filename) {
        this.filename = filename;
    }

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

使用代理模式

接下来,在主程序中使用代理模式来延迟加载图像。

public class ImageLoader {
    public static void main(String[] args) {
        Image image1 = new ImageProxy("image1.jpg");
        Image image2 = new ImageProxy("image2.jpg");

        // 第一次调用时,代理会加载图像
        image1.display(); // 输出 "Loading image from disk: image1.jpg" 和 "Displaying image: image1.jpg"

        // 第二次调用时,代理已经有了真实的图像对象,所以不会重新加载
        image1.display(); // 输出 "Displaying image: image1.jpg"

        // 加载第二个图像
        image2.display(); // 输出 "Loading image from disk: image2.jpg" 和 "Displaying image: image2.jpg"
    }
}

使用场景

代理模式适用于以下情况:

  • 为了控制对一个对象的访问。
  • 为了在访问一个对象时做一些额外的工作,如缓存、日志记录、权限验证等。
  • 当创建一个对象的代价很高时,通过代理来延迟创建的时间。

总结

代理模式通过提供一个代理对象来控制对真实对象的访问,同时可以在访问真实对象前后执行一些额外的操作。这种方式不仅增强了代码的可维护性和可扩展性,还能有效地优化资源的使用,提高系统的性能。


以上就是代理模式的一个实现案例,希望这篇文章能帮助你理解代理模式的使用方式及其优势。

0

评论区