设计模式之代理模式

来自ChatGPt

// 定义接口
interface Image {
    void display();
}

// 创建实际主题类
class RealImage implements Image {
    private String filename;

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

    private void loadFromDisk() {
        System.out.println("从磁盘加载图像:" + filename);
    }

    @Override
    public void display() {
        System.out.println("显示图像:" + filename);
    }
}

// 创建代理类
class ImageProxy implements Image {
    private String filename;
    private RealImage realImage;

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

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

// 使用代理类来代替实际主题类进行访问
public class ProxyDemo {
    public static void main(String[] args) {
        // 创建代理对象
        Image image = new ImageProxy("image.jpg");

        // 第一次显示图像,从磁盘加载图像
        image.display();

        // 第二次显示图像,直接显示已加载的图像
        image.display();
    }
}

在上面的示例中,我们定义了一个 Image 接口,并创建了一个实际的主题类 RealImage 实现该接口。RealImage 类表示实际的图像处理类,它在初始化时从磁盘加载图像,并在调用 display() 方法时显示图像。

然后我们创建了一个代理类 ImageProxy 实现 Image 接口,它包含一个对 RealImage 对象的引用。在代理类中,当调用 display() 方法时,首先检查实际主题对象是否已经存在,如果不存在则创建实际主题对象并调用其 display() 方法;如果已经存在,则直接调用实际主题对象的 display() 方法。这样可以在需要时延迟创建和初始化实际主题对象,并控制对实际主题对象的访问。

在示例的 main() 方法中,我们使用代理对象来访问图像。第一次调用 display() 方法时,会从磁盘加载图像;第二次调用时,直接显示已加载的图像,不再重复加载。通过代理对象,可以实现对实际主题对象的间接访问和控制。

请注意,在更复杂的实际场景中,代理模式可以应用于网络请求、安全校验、缓存等方面,以实现更多功能和效果。本示例仅为演示基本的代理模式原理。

你可能感兴趣的:(android网络,设计模式,代理模式)