Design patterns

patterns12ProxyPattern

Path
pkg8patterns/patterns12ProxyPattern.java
Package
pkg8patterns
Study order
12
Run
Single-file source launch
Command
java pkg8patterns/patterns12ProxyPattern.java

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg8patterns/patterns12ProxyPattern.java
1package pkg8patterns;2 3/*4 * Proxy (Structural)5 * ------------------6 * INTENT: provide a surrogate/placeholder for another object to control access7 *         (lazy loading, access control, caching, logging, remoting).8 * UML: Subject <|-- RealSubject and <|-- Proxy (proxy holds a RealSubject).9 * PROS: control/extend access without changing the real object.10 * CONS: extra indirection; possible latency.11 * REAL-WORLD: Spring AOP proxies, java.lang.reflect.Proxy, Hibernate lazy loading.12 */13public class patterns12ProxyPattern {14 15    interface Image { String display(); }16 17    // Expensive object18    static class RealImage implements Image {19        private final String file;20        RealImage(String file) { this.file = file; loadFromDisk(); }21        private void loadFromDisk() { System.out.println("  loading " + file + " from disk (expensive)"); }22        public String display() { return "showing " + file; }23    }24 25    // Virtual proxy: defers creation until first use (lazy loading)26    static class ImageProxy implements Image {27        private final String file;28        private RealImage real;     // created on demand29        ImageProxy(String file) { this.file = file; }30        public String display() {31            if (real == null) real = new RealImage(file);   // lazy init32            return real.display();33        }34    }35 36    public static void main(String[] args) {37        Image image = new ImageProxy("photo.png");38        System.out.println("proxy created (nothing loaded yet)");39        System.out.println(image.display());   // triggers load40        System.out.println(image.display());   // reuses, no reload41    }42}