fbpx
维基百科

橋接模式

橋接模式軟件設計模式中最複雜的模式之一,它把事物對象和其具體行爲、具體特徵分離開來,使它们可以各自独立的变化。事物對象僅是一個抽象的概念。如“圓形”、“三角形”歸于抽象的“形狀”之下,而“畫圓”、“畫三角”歸于實現行爲的“畫圖”類之下,然後由“形狀”調用“畫圖”。

結構 编辑

 

Abstraction
定義抽象的介面
該介面包含實現具體行爲、具體特徵的Implementor介面
Refined Abstraction
抽象介面Abstraction的子類,依舊是一個抽象的事物名
Implementor
定義具體行爲、具體特徵的應用介面
ConcreteImplementor
實現Implementor介面

示例 编辑

下列各語言的代碼都用於寫出兩個不同的圓的坐標和半徑。

API1.circle at 1:2 7.5 API2.circle at 5:7 27.5 

Java 编辑

/** "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();  }  }  } 

用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 : 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++ 编辑

#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; } 

Python 编辑

# Implementor class DrawingAPI: def drawCircle(x, y, radius): pass # ConcreteImplementor 1/2 class DrawingAPI1(DrawingAPI): def drawCircle(self, x, y, radius): print "API1.circle at %f:%f radius %f" % (x, y, radius) # ConcreteImplementor 2/2 class DrawingAPI2(DrawingAPI): def drawCircle(self, x, y, radius): print "API2.circle at %f:%f radius %f" % (x, y, radius) # Abstraction class Shape: # low-level def draw(self): pass # high-level def resizeByPercentage(self, pct): pass # Refined Abstraction class CircleShape(Shape): def __init__(self, x, y, radius, drawingAPI): self.__x = x self.__y = y self.__radius = radius self.__drawingAPI = drawingAPI # low-level i.e. Implementation specific def draw(self): self.__drawingAPI.drawCircle(self.__x, self.__y, self.__radius) # high-level i.e. Abstraction specific def resizeByPercentage(self, pct): self.__radius *= pct def 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() 


橋接模式, 是軟件設計模式中最複雜的模式之一, 它把事物對象和其具體行爲, 具體特徵分離開來, 使它们可以各自独立的变化, 事物對象僅是一個抽象的概念, 圓形, 三角形, 歸于抽象的, 形狀, 之下, 畫圓, 畫三角, 歸于實現行爲的, 畫圖, 類之下, 然後由, 形狀, 調用, 畫圖, 目录, 結構, 示例, java, 用generics類庫的c, python結構, 编辑, nbsp, abstraction, 定義抽象的介面, 該介面包含實現具體行爲, 具體特徵的implementor介面, refined. 橋接模式是軟件設計模式中最複雜的模式之一 它把事物對象和其具體行爲 具體特徵分離開來 使它们可以各自独立的变化 事物對象僅是一個抽象的概念 如 圓形 三角形 歸于抽象的 形狀 之下 而 畫圓 畫三角 歸于實現行爲的 畫圖 類之下 然後由 形狀 調用 畫圖 目录 1 結構 2 示例 2 1 Java 2 2 C 2 3 用generics類庫的C 2 4 C 2 5 Python結構 编辑 nbsp Abstraction 定義抽象的介面 該介面包含實現具體行爲 具體特徵的Implementor介面 Refined Abstraction 抽象介面Abstraction的子類 依舊是一個抽象的事物名 Implementor 定義具體行爲 具體特徵的應用介面 ConcreteImplementor 實現Implementor介面示例 编辑下列各語言的代碼都用於寫出兩個不同的圓的坐標和半徑 API1 circle at 1 2 7 5 API2 circle at 5 7 27 5 Java 编辑 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 用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 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 lt T gt 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 lt DrawingAPI1 gt 1 2 3 shapes 1 new CircleShape lt DrawingAPI2 gt 5 7 11 foreach IShape shape in shapes shape ResizeByPercentage 2 5 shape Draw C 编辑 include lt iostream gt 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 lt lt API1 circle at lt lt x lt lt lt lt y lt lt lt lt radius lt lt endl Concrete ImplementorB class DrawingAPI2 public DrawingAPI public void drawCircle double x double y double radius cout lt lt API2 circle at lt lt x lt lt lt lt y lt lt lt lt radius lt lt 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 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 编辑 Implementor class DrawingAPI def drawCircle x y radius pass ConcreteImplementor 1 2 class DrawingAPI1 DrawingAPI def drawCircle self x y radius print API1 circle at f f radius f x y radius ConcreteImplementor 2 2 class DrawingAPI2 DrawingAPI def drawCircle self x y radius print API2 circle at f f radius f x y radius Abstraction class Shape low level def draw self pass high level def resizeByPercentage self pct pass Refined Abstraction class CircleShape Shape def init self x y radius drawingAPI self x x self y y self radius radius self drawingAPI drawingAPI low level i e Implementation specific def draw self self drawingAPI drawCircle self x self y self radius high level i e Abstraction specific def resizeByPercentage self pct self radius pct def 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 取自 https zh wikipedia org w index php title 橋接模式 amp oldid 65420869, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。