文章出處

索引

別名

  • Handle
  • Body

意圖

將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

Decouple an abstraction from its implementation so that the two can vary independently.

結構

參與者

Abstraction

  • 定義抽象類的接口。
  • 維護一個指向 Implementor 類型對象的指針。

RefinedAbstraction

  • 擴充由 Abstraction 定義的接口。

Implementor

  • 定義實現類的接口,該接口不一定要與 Abstraction 接口完全一致,甚至可以完全不同。
  • Implementor 接口僅提供基本操作,Abstraction 則定義了基于這些基本操作的較高層次的操作。

ConcreteImplementor

  • 實現 Implementor 接口并定義它的具體實現。

適用性

在以下情況下可以使用 Bridge 模式:

  • 你不希望在抽象和它的實現部分之間有一個固定的綁定關系。比如需要在程序運行時刻實現部分應可以被選擇或者切換。
  • 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。
  • 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。
  • 你想對客戶完全隱藏抽象的實現部分。
  • 類的層次需要將一個對象分解成兩個部分。
  • 你想在多個對象間共享實現,但同時要求客戶并不知道這一點。

效果

  • 分離接口及其實現部分。
  • 提高可擴充性。
  • 實現細節對客戶透明。

相關模式

  • Abstract Factory 模式可以用來創建和配置一個特定的 Bridge 模式。
  • Adaptor 模式用來幫助無關的類協同工作,它通常在系統設計完成后才會被使用。Bridge 模式則是在系統開始時就被使用,它使得抽象接口和實現部分可以獨立進行改變。
  • Bridge 模式的結構與對象 Adapter 模式類似,但是 Bridge 模式的出發點不同:Bridge 目的是將接口部分和實現部分分離,從而對它們可以較為容易也相對獨立的加以改變。而 Adapter 則意味著改變一個已有對象的接口。

實現

實現方式(一):使用 Bridge 模式分離抽象部分和實現部分。

當一個抽象可能有多個實現時,通常用繼承來協調它們。抽象類定義對該抽象的接口,而具體的子類則用不同方式加以實現。

但是此方法有時不夠靈活。繼承機制將抽象部分與它的實現部分固定在一起,使得難以對抽象部分和實現部分獨立地進行修改、擴充和重用。

使用 Bridge 模式,它在抽象類與它的實現直接起到了橋梁作用,使它們可以獨立地變化。

 1 namespace BridgePattern.Implementation1
 2 {
 3   public class Abstraction
 4   {
 5     protected IImplementor _implementor;
 6 
 7     public Abstraction(IImplementor implementor)
 8     {
 9       _implementor = implementor;
10     }
11 
12     public virtual void Operation()
13     {
14       _implementor.OperationImp1();
15     }
16   }
17 
18   public interface IImplementor
19   {
20     void OperationImp1();
21   }
22 
23   public class ConcreteImplementorA : IImplementor
24   {
25     public void OperationImp1()
26     {
27       // do something
28     }
29   }
30 
31   public class ConcreteImplementorB : IImplementor
32   {
33     public void OperationImp1()
34     {
35       // do something
36     }
37   }
38 
39   public class ChildAbstraction : Abstraction
40   {
41     public ChildAbstraction(IImplementor implementor)
42       : base(implementor)
43     {
44     }
45 
46     public override void Operation()
47     {
48       base.Operation();
49       // do some others
50     }
51   }
52 
53   public class Client
54   {
55     public void TestCase1()
56     {
57       IImplementor implementor1 = new ConcreteImplementorA();
58       IImplementor implementor2 = new ConcreteImplementorB();
59 
60       Abstraction abstraction1 = new Abstraction(implementor1);
61       Abstraction abstraction2 = new ChildAbstraction(implementor2);
62 
63       abstraction1.Operation();
64       abstraction2.Operation();
65     }
66   }
67 }

設計模式之美》為 Dennis Gao 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()