브리지 패턴
위키백과, 우리 모두의 백과사전.
브리지 패턴(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 = x; this.y = y; this.radius = 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 Shape[2]; shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); for (Shape shape : shapes) { shape.resizeByPercentage(2.5); shape.draw(); } } }
C# [편집]
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 = x; this.y = y; this.radius = 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 IShape[2]; shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); foreach (IShape shape in shapes) { shape.ResizeByPercentage(2.5); shape.Draw(); } } }
이름을 사용한 C# [편집]
using System; /** "Implementor" */ interface IDrawingAPI { void DrawCircle(double x, double y, double radius); } /** "ConcreteImplementor" 1/2 */ struct 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 */ struct 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<T> : IShape where T : struct, IDrawingAPI { private double x, y, radius; private static IDrawingAPI drawingAPI = new T(); public CircleShape(double x, double y, double radius) { this.x = x; this.y = y; this.radius = radius; } // 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 IShape[2]; shapes[0] = new CircleShape<DrawingAPI1>(1, 2, 3); shapes[1] = new CircleShape<DrawingAPI2>(5, 7, 11); foreach (IShape shape in shapes) { shape.ResizeByPercentage(2.5); shape.Draw(); } } }
C++ [편집]
API1.circle at 1:2 7.5 API2.circle at 5:7 27.5
#include <iostream> 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 << "API1.circle at " << x << ":" << y << " " << radius << endl; } }; /* Concrete ImplementorB*/ class DrawingAPI2 : public DrawingAPI { public: void drawCircle(double x, double y, double radius) { cout << "API2.circle at " << x << ":" << y << " " << radius << endl; } }; /* Abstraction*/ class Shape { public: virtual ~Shape() {}; virtual void draw() = 0; virtual void resizeByPercentage(double pct) = 0; }; /* Refined Abstraction*/ class CircleShape : public Shape { public: CircleShape(double x, double y,double radius, DrawingAPI *drawingAPI){ m_x = x; m_y = y; m_radius = radius; m_drawingAPI = drawingAPI; } void draw() { m_drawingAPI->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; }
| 이 글은 컴퓨터 과학에 관한 토막글입니다. 서로의 지식을 모아 알차게 문서를 완성해 갑시다. |