Design patterns

patterns7BridgePattern

Path
pkg8patterns/patterns7BridgePattern.java
Package
pkg8patterns
Study order
7
Run
Single-file source launch
Command
java pkg8patterns/patterns7BridgePattern.java

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

pkg8patterns/patterns7BridgePattern.java
1package pkg8patterns;2 3/*4 * Bridge (Structural)5 * -------------------6 * INTENT: decouple an abstraction from its implementation so the two can vary7 *         independently (composition over inheritance to avoid class explosion).8 * UML: Abstraction --has-a--> Implementor ; both have their own hierarchies.9 * PROS: avoids N*M subclasses; switch implementations at runtime.10 * CONS: more indirection up front.11 * REAL-WORLD: JDBC (API) over drivers; SLF4J over logging backends.12 */13public class patterns7BridgePattern {14 15    // Implementor hierarchy16    interface Renderer { String renderCircle(double r); }17    static class VectorRenderer implements Renderer {18        public String renderCircle(double r) { return "vector circle r=" + r; }19    }20    static class RasterRenderer implements Renderer {21        public String renderCircle(double r) { return "raster pixels for r=" + r; }22    }23 24    // Abstraction holds a reference (the "bridge") to an Implementor25    static abstract class Shape {26        protected final Renderer renderer;27        Shape(Renderer renderer) { this.renderer = renderer; }28        abstract String draw();29    }30    static class Circle extends Shape {31        private final double radius;32        Circle(Renderer renderer, double radius) { super(renderer); this.radius = radius; }33        String draw() { return renderer.renderCircle(radius); }34    }35 36    public static void main(String[] args) {37        System.out.println(new Circle(new VectorRenderer(), 5).draw());38        System.out.println(new Circle(new RasterRenderer(), 5).draw());39    }40}