橋接模式

橋接模式是軟體設計模式中最複雜的模式之一，它把事物物件和其具體行為、具體特徵分離開來，使它們可以各自獨立的變化。事物物件僅是一個抽象的概念。如“圓形”、“三角形”歸於抽象的“形狀”之下，而“畫圓”、“畫三角”歸於實現行為的“畫圖”類之下，然後由“形狀”呼叫“畫圖”。定義抽象的介面該介面包含實現具體行為、具體特徵的Implementor介面抽象介面Abstraction的子類，依舊是一個抽象的事物名定義具體行為、具體特徵的應用介面實現Implementor介面示例.下列各語言的程式碼都用於寫出兩個不同的圓的坐標和半徑。Java./** "Implementor" */interface DrawingAPIpublic void drawCircle(double x, double y, double radius);/** "ConcreteImplementor" 1/2 */class DrawingAPI1 implements DrawingAPIpublic 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 DrawingAPIpublic void drawCircle(double x, double y, double radius)System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);/** "Abstraction" */interface Shapepublic void draw(); // low-levelpublic void resizeByPercentage(double pct); // high-level/** "Refined Abstraction" */class CircleShape implements Shapeprivate 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 specificpublic void draw()drawingAPI.drawCircle(x, y, radius);// high-level i.e. Abstraction specificpublic 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 : IDrawingAPIpublic 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)// high-level (i.e. Abstraction-specific)/** "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();用generics類庫的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 : IDrawingAPIpublic 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 : IShapewhere T : struct, IDrawingAPIprivate 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)// high-level (i.e. Abstraction-specific)/** "Client" */class BridgePattern {public static void Main(string[] args) {IShape[] shapes = new IShape[2];shapes[0] = new CircleShape(1, 2, 3);shapes[1] = new CircleShape(5, 7, 11);foreach (IShape shape in shapes) {shape.ResizeByPercentage(2.5);shape.Draw();C++.using namespace std;/* Implementor*/class DrawingAPI {public:virtual void drawCircle(double x, double y, double radius) = 0;/* 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 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-&gt;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,&amp;dap1);CircleShape circle2(5,7,11,&amp;dap2);circle1.resizeByPercentage(2.5);circle2.resizeByPercentage(2.5);circle1.draw();circle2.draw();return 0;Python.class DrawingAPI:def drawCircle(x, y, radius):passclass DrawingAPI1(DrawingAPI):def drawCircle(self, x, y, radius):print "API1.circle at %f:%f radius %f" % (x, y, radius)class DrawingAPI2(DrawingAPI):def drawCircle(self, x, y, radius):print "API2.circle at %f:%f radius %f" % (x, y, radius)class Shape:# low-leveldef draw(self):pass# high-leveldef resizeByPercentage(self, pct):passclass CircleShape(Shape):def __init__(self, x, y, radius, drawingAPI):self.__x = xself.__y = yself.__radius = radiusself.__drawingAPI = drawingAPI# low-level i.e. Implementation specificdef draw(self):self.__drawingAPI.drawCircle(self.__x, self.__y, self.__radius)# high-level i.e. Abstraction specificdef resizeByPercentage(self, pct):self.__radius *= pctdef main():shapes = [CircleShape(1, 2, 3, DrawingAPI1()),CircleShape(5, 7, 11, DrawingAPI2())for shape in shapes:shape.resizeByPercentage(2.5)shape.draw()if __name__ == "__main__":main()