브리지 패턴 (Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다. 구조 /* "Implementor" */ interface DrawingAPI { public void drawCircle(double x, double y, double radius); } /* "ConcreteImplementor" 1/2 */ class DrawingAPI1 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); } } /* "ConcreteImplementor" 2/2 */ class DrawingAPI2 implements DrawingAPI { public void drawCircle(double x, double y, double radius) { System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); } } /* "Abstraction" */ interface Shape { public void draw(); // low-level public void resizeByPercentage(double pct); // high-level } /* "Refined Abstraction" */ class CircleShape implements Shape { private double x, y, radius; private DrawingAPI drawingAPI; public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) { this.x radius; this.drawingAPI = drawingAPI; } // low-level i.e. Implementation specific public void draw() { drawingAPI.drawCircle(x, y, radius); } // high-level i.e. Abstraction specific public void resizeByPercentage(double pct) { radius *= pct; } } /* "Client" */ class BridgePattern { public static void main(String args) { Shape shapes = new Shape2; shapes0 = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes1 = new CircleShape(5, 7, 11, new DrawingAPI2()); for (Shape shape shapes) { shape.resizeByPercentage(2.5); shape.draw(); } } } using System; /* "Implementor" */ interface IDrawingAPI { void DrawCircle(double x, double y, double radius); } /* "ConcreteImplementor" 1/2 */ class DrawingAPI1 IDrawingAPI { public void DrawCircle(double x, double y, double radius) { System.Console.WriteLine("API1.circle at {0}:{1} radius {2}", x, y, radius); } } /* "ConcreteImplementor" 2/2 */ class DrawingAPI2 IDrawingAPI { public void DrawCircle(double x, double y, double radius) { System.Console.WriteLine("API2.circle at {0}:{1} radius {2}", x, y, radius); } } /* "Abstraction" */ interface IShape { void Draw(); // low-level (i.e. Implementation-specific) void ResizeByPercentage(double pct); // high-level (i.e. Abstraction-specific) } /* "Refined Abstraction" */ class CircleShape IShape { private double x, y, radius; private IDrawingAPI drawingAPI; public CircleShape(double x, double y, double radius, IDrawingAPI drawingAPI) { this.x radius; this.drawingAPI = drawingAPI; } // low-level (i.e. Implementation-specific) public void Draw() { drawingAPI.DrawCircle(x, y, radius); } // high-level (i.e. Abstraction-specific) public void ResizeByPercentage(double pct) { radius *= pct; } } /* "Client" */ class BridgePattern { public static void Main(string args) { IShape shapes = new IShape2; shapes0 = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes1 = new CircleShape(5, 7, 11, new DrawingAPI2()); foreach (IShape shape in shapes) { shape.ResizeByPercentage(2.5); shape.Draw(); } } } + 출력 결과 API1.circle at 1:2 7.5 API2.circle at 5:7 27.5 #include using namespace std; / Implementor*/ class DrawingAPI { public virtual void drawCircle(double x, double y, double radius) = 0; virtual ~DrawingAPI(){}; }; / Concrete ImplementorA*/ class DrawingAPI1 public DrawingAPI { public void drawCircle(double x, double y, double radius) { cout drawCircle(m_x,m_y,m_radius); } void resizeByPercentage(double pct) { m_radius *= pct; } private double m_x,m_y,m_radius; DrawingAPI *m_drawingAPI; }; int main(void) { DrawingAPI1 dap1; DrawingAPI2 dap2; CircleShape circle1(1,2,3,&dap1); CircleShape circle2(5,7,11,&dap2); circle1.resizeByPercentage(2.5); circle2.resizeByPercentage(2.5); circle1.draw(); circle2.draw(); return 0; } package main import ( "fmt" ) // Implementor type DrawingAPI interface { drawCircle(float32, float32, float32) } // ConcreteImplementor 1/2 type DrawingAPI1 struct{} func (d *DrawingAPI1) drawCircle(x float32, y float32, radius float32) { fmt.Printf("API1.circle at %f:%f radius %f\n", x, y, radius) } // ConcreteImplementor 2/2 type DrawingAPI2 struct{} func (d *DrawingAPI2) drawCircle(x float32, y float32, radius float32) { fmt.Printf("API2.circle at %f:%f radius %f\n", x, y, radius) } // Abstraction type Shape interface { draw() resizeByPercentage(float32) } // Refined Abstraction type CircleShape struct { x, y, radius float32 drawingAPI DrawingAPI } // Implementation specific func (c *CircleShape) draw() { c.drawingAPI.drawCircle(c.x, c.y, c.radius) } // Abstraction specific func (c *CircleShape) resizeByPercentage(pct float32) { c.radius *= pct } // Client func main() { shape1 := &CircleShape{1, 2, 3, &DrawingAPI1{}} shape1.resizeByPercentage(2.5) shape1.draw() shape2 := &CircleShape{5, 7, 11, &DrawingAPI2{}} shape2.resizeByPercentage(2) shape2.draw() } 분류:소프트웨어 디자인 패턴