文章出處
文章列表
索引
- 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 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。
文章列表
全站熱搜