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.
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}