設計模式----Bridge模式

pamxy發表於2013-06-24

轉自:http://blog.csdn.net/fly542/article/details/6720217

原來對bridge模式理解不是很深入,感覺和build模式很相似,今天又看了四人幫的關於bridge模式的描述,有些新的理解

先來說下適用性

1、不想抽象和實現之間有一個固定的繫結關係。(因為程式在執行時實現部分可以被選擇或者切換)。

2、類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時bridge模式使你可以對不同的抽象介面和實現部分進行組合,並分別對他們進行擴充。(常用)

3、對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的程式碼不必重新編譯。

4、你想對客戶完全以藏抽象的實現部分。在c++中,類的表示在類介面中是可見的。

5、在多個物件間共享實現(可能是引用計數), 但同時要求客戶並不知道這一點。

還有一種方式沒理解,書上是這麼說的:正如在意圖一節的類圖中所示的那樣,有許多類要生成。這樣一種類層次結構說明你必須將一個物件分解城兩個部分。這種層次結構為“巢狀的普化”(nestd generalizations)***

 

結構圖如下

 

示例程式碼如下

  1. #include <QtCore/QCoreApplication>  
  2.   
  3. #include <iostream>  
  4.   
  5. class Implementor;  
  6.   
  7. // 維護一個Implementor類的指標  
  8. class Abstraction  
  9. {  
  10. public:  
  11.     Abstraction(Implementor* pImplementor);  
  12.     virtual ~Abstraction();  
  13.   
  14.     void Operation();  
  15.   
  16. protected:  
  17.     Implementor* m_pImplementor;  
  18. };  
  19.   
  20. // 為實現Abstraction定義的抽象基類,定義了實現的介面函式  
  21. class Implementor  
  22. {  
  23. public:  
  24.     Implementor(){}  
  25.     virtual ~Implementor(){}  
  26.   
  27.     virtual void OperationImpl() = 0;  
  28. };  
  29.   
  30. // 繼承自Implementor,是Implementor的不同實現之一  
  31. class ConcreateImplementorA  
  32.     : public Implementor  
  33. {  
  34. public:  
  35.     ConcreateImplementorA(){}  
  36.     virtual ~ConcreateImplementorA(){}  
  37.   
  38.     virtual void OperationImpl();  
  39. };  
  40.   
  41. // 繼承自Implementor,是Implementor的不同實現之一  
  42. class ConcreateImplementorB  
  43.     : public Implementor  
  44. {  
  45. public:  
  46.     ConcreateImplementorB(){}  
  47.     virtual ~ConcreateImplementorB(){}  
  48.   
  49.     virtual void OperationImpl();  
  50. };  
  51.   
  52. void ConcreateImplementorA::OperationImpl()  
  53. {  
  54.     std::cout << "Implementation by ConcreateImplementorA\n";  
  55. }  
  56.   
  57. void ConcreateImplementorB::OperationImpl()  
  58. {  
  59.     std::cout << "Implementation by ConcreateImplementorB\n";  
  60. }  
  61.   
  62. Abstraction::Abstraction(Implementor* pImplementor)  
  63.     : m_pImplementor(pImplementor)  
  64. {  
  65. }  
  66.   
  67. Abstraction::~Abstraction()  
  68. {  
  69. }  
  70.   
  71. void Abstraction::Operation()  
  72. {  
  73.     m_pImplementor->OperationImpl();  
  74. }  
  75.   
  76. template <typename deleteType>  
  77. inline void deleteObject(const deleteType * obj)  
  78. {  
  79.     delete obj;  
  80.     obj = 0;  
  81. }  
  82.   
  83. int main(int argc, char *argv[])  
  84. {  
  85.     QCoreApplication a(argc, argv);  
  86.   
  87.     ConcreateImplementorA *pImplA = new ConcreateImplementorA();  
  88.     Abstraction *pAbstraction1 = new Abstraction(pImplA);  
  89.     pAbstraction1->Operation();  
  90.   
  91.     ConcreateImplementorB *pImplB = new ConcreateImplementorB();  
  92.     Abstraction *pAbstraction2 = new Abstraction(pImplB);  
  93.     pAbstraction2->Operation();  
  94.   
  95.     deleteObject(pImplB);  
  96.     deleteObject(pAbstraction2);  
  97.     deleteObject(pImplA);  
  98.     deleteObject(pAbstraction1);  
  99.   
  100.   
  101.     return a.exec();  
  102. }  


 

因為Adapter中包含了一個Adaptee物件,這是一個聚合或者組合的關係。而且也是在Adapter的request方法中呼叫了Adaptee物件中的方法,從這個角度而言,Adapter模式和Bridge模式是非常類似的。

 

但是,他們之間有本質的區別:

1.       在Adapter模式中,Adaptee本身往往已經是一個具體的、已經存在的類。在Bridge模式中,Implementor則是一個抽象類或者介面;

2.       在Adapter模式中,Adapter類也是一個具體的類。在Bridge模式中,Abstraction則是一個抽象類;

3.       在Adapter模式中,Adapter類派生於一個抽象類/介面(客戶程式所期望的)。在Bridge模式中,Abstraction類則不存在這樣的情況。

4.       最本質同時也是最重要的區別是,它們的意圖是不同的。


相關文章