設計模式----Bridge模式
轉自:http://blog.csdn.net/fly542/article/details/6720217
原來對bridge模式理解不是很深入,感覺和build模式很相似,今天又看了四人幫的關於bridge模式的描述,有些新的理解
先來說下適用性
1、不想抽象和實現之間有一個固定的繫結關係。(因為程式在執行時實現部分可以被選擇或者切換)。
2、類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時bridge模式使你可以對不同的抽象介面和實現部分進行組合,並分別對他們進行擴充。(常用)
3、對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的程式碼不必重新編譯。
4、你想對客戶完全以藏抽象的實現部分。在c++中,類的表示在類介面中是可見的。
5、在多個物件間共享實現(可能是引用計數), 但同時要求客戶並不知道這一點。
還有一種方式沒理解,書上是這麼說的:正如在意圖一節的類圖中所示的那樣,有許多類要生成。這樣一種類層次結構說明你必須將一個物件分解城兩個部分。這種層次結構為“巢狀的普化”(nestd generalizations)***
結構圖如下
示例程式碼如下
- #include <QtCore/QCoreApplication>
- #include <iostream>
- class Implementor;
- // 維護一個Implementor類的指標
- class Abstraction
- {
- public:
- Abstraction(Implementor* pImplementor);
- virtual ~Abstraction();
- void Operation();
- protected:
- Implementor* m_pImplementor;
- };
- // 為實現Abstraction定義的抽象基類,定義了實現的介面函式
- class Implementor
- {
- public:
- Implementor(){}
- virtual ~Implementor(){}
- virtual void OperationImpl() = 0;
- };
- // 繼承自Implementor,是Implementor的不同實現之一
- class ConcreateImplementorA
- : public Implementor
- {
- public:
- ConcreateImplementorA(){}
- virtual ~ConcreateImplementorA(){}
- virtual void OperationImpl();
- };
- // 繼承自Implementor,是Implementor的不同實現之一
- class ConcreateImplementorB
- : public Implementor
- {
- public:
- ConcreateImplementorB(){}
- virtual ~ConcreateImplementorB(){}
- virtual void OperationImpl();
- };
- void ConcreateImplementorA::OperationImpl()
- {
- std::cout << "Implementation by ConcreateImplementorA\n";
- }
- void ConcreateImplementorB::OperationImpl()
- {
- std::cout << "Implementation by ConcreateImplementorB\n";
- }
- Abstraction::Abstraction(Implementor* pImplementor)
- : m_pImplementor(pImplementor)
- {
- }
- Abstraction::~Abstraction()
- {
- }
- void Abstraction::Operation()
- {
- m_pImplementor->OperationImpl();
- }
- template <typename deleteType>
- inline void deleteObject(const deleteType * obj)
- {
- delete obj;
- obj = 0;
- }
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- ConcreateImplementorA *pImplA = new ConcreateImplementorA();
- Abstraction *pAbstraction1 = new Abstraction(pImplA);
- pAbstraction1->Operation();
- ConcreateImplementorB *pImplB = new ConcreateImplementorB();
- Abstraction *pAbstraction2 = new Abstraction(pImplB);
- pAbstraction2->Operation();
- deleteObject(pImplB);
- deleteObject(pAbstraction2);
- deleteObject(pImplA);
- deleteObject(pAbstraction1);
- return a.exec();
- }
因為Adapter中包含了一個Adaptee物件,這是一個聚合或者組合的關係。而且也是在Adapter的request方法中呼叫了Adaptee物件中的方法,從這個角度而言,Adapter模式和Bridge模式是非常類似的。
但是,他們之間有本質的區別:
1. 在Adapter模式中,Adaptee本身往往已經是一個具體的、已經存在的類。在Bridge模式中,Implementor則是一個抽象類或者介面;
2. 在Adapter模式中,Adapter類也是一個具體的類。在Bridge模式中,Abstraction則是一個抽象類;
3. 在Adapter模式中,Adapter類派生於一個抽象類/介面(客戶程式所期望的)。在Bridge模式中,Abstraction類則不存在這樣的情況。
4. 最本質同時也是最重要的區別是,它們的意圖是不同的。
相關文章
- 設計模式 - Bridge 橋模式設計模式
- 設計模式 | 橋接模式(bridge)設計模式橋接
- 《設計模式》 - 6. 橋接模式( Bridge )設計模式橋接
- C#設計模式-橋接模式(Bridge Pattern)C#設計模式橋接
- C#設計模式系列:橋接模式(Bridge)C#設計模式橋接
- JAVA設計模式之 橋接模式【Bridge Pattern】Java設計模式橋接
- 設計模式--橋接模式Bridge(結構型)設計模式橋接
- 設計模式(五)橋接模式Bridge == Pointer To Implementation設計模式橋接
- 設計模式的征途—8.橋接(Bridge)模式設計模式橋接
- C#設計模式(8)——橋接模式(Bridge Pattern)C#設計模式橋接
- Bridge模式模式
- Java橋模式(Bridge模式)Java模式
- 我所理解的設計模式(C++實現)——橋模式(Bridge Pattern)設計模式C++
- 從重構的角度學習bridge設計模式設計模式
- 橋接模式(Bridge)橋接模式
- 設計模式(Design Patterns)筆記之三:Bridge (轉)設計模式筆記
- 從重構的角度學習bridge設計模式 (轉)設計模式
- 類爆炸之Bridge模式模式
- c++涉及模式 橋接模式(bridge Pattern)C++模式橋接
- [用設計模式鍛鍊C#系列]之Singleton、Bridge (轉)設計模式C#
- 設計模式----工廠設計模式設計模式
- 設計模式-工廠設計模式設計模式
- Java設計模式——模板設計模式Java設計模式
- 設計模式---外觀設計模式設計模式
- [設計模式]單例設計模式設計模式單例
- 設計模式-裝飾設計模式設計模式
- 你好BANQ,請教Bridge模式模式
- 設計模式----代理模式設計模式
- 設計模式----中介模式設計模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-中介模式設計模式
- 設計模式-模板模式設計模式
- 設計模式——模板模式設計模式
- 設計模式——代理模式設計模式
- 設計模式-代理模式設計模式
- 設計模式-策略模式設計模式
- 設計模式~代理模式設計模式