下面是一个用Java写的代理模式的例子:

首先,定义一个接口Image,表示图像的操作:

public interface Image {
    void display();
}

然后,实现该接口的具体类RealImage,表示真实的图像操作:

public class RealImage implements Image {
    private String filename;

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

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

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

接下来,定义一个代理类ProxyImage,用于控制对真实图像的访问:

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 image1 = new ProxyImage("image1.jpg");
        Image image2 = new ProxyImage("image2.jpg");

        // 图像1的加载和显示
        image1.display();

        // 图像2的加载和显示
        image2.display();

        // 图像1已经加载过,直接显示
        image1.display();
    }
}

输出结果:

Loading image from disk: image1.jpg
Displaying image: image1.jpg
Loading image from disk: image2.jpg
Displaying image: image2.jpg
Displaying image: image1.jpg

在这个例子中,RealImage表示真实的图像操作,ProxyImage作为代理类控制对RealImage的访问。
当需要显示图像时,如果图像还没有加载,则由ProxyImage负责加载图像,然后通过RealImage显示图像。如果图像已经加载过,ProxyImage直接调用RealImage显示图像,避免了重复加载。