ImageProxy.java

package com.designpatterns.structural.proxy.classic;

/**
 * Implements the same {@link Image} interface as the thing it stands in for, so callers can't
 * tell the difference - until the first {@code display()} call, no expensive load has happened
 * at all.
 */
public class ImageProxy implements Image {

    private final String filename;
    private RealImage realImage;

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

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

    public boolean isLoaded() {
        return realImage != null;
    }
}