1. 程式人生 > >《大話設計模式》讀書筆記之C++實現--chapter22橋接模式

《大話設計模式》讀書筆記之C++實現--chapter22橋接模式

橋接模式的核心在於理解好繼承屬於is-a的關係,當我們使用繼承的時候先要在心裡問自己一遍子類是不是一個父類,如果答案是否,那我們就要考慮如何重新定義父類實現更好的抽象,此時我們可以聯想到合成/聚合關係,合成代表的是一種強的擁有關係,也就是B是A的一部分,比如大雁的翅膀是大雁的一部分。聚合代表的是一種弱的擁有關係,也就是A的物件可以包含B,但B不是A的一部分,比如一隻大雁可以是一個雁群,但一個雁群可以有多隻大雁。文中用手機軟體和手機品牌的例子形象地解釋了這種關係,無論我們是使用手機品牌或者手機軟體作為抽象類,其子類都會變地十分龐大,當需要修改時也要修改多處,但我們通過聚合/合成的關係重新設計,將手機品牌設為抽象類,其中包含手機軟體的抽象類,然後將兩者設計為聚合關係,即手機品牌中包含手機軟體,手機軟體不是手機品牌的一部分,即使沒有手機軟體,也不會影響手機品牌。然後我們的抽象手機品牌就可以派生出不同的手機品牌,同樣,手機軟體也可以派生出不同的手機軟體,當需要時就可以將不同的手機軟體功能加入到不同的手機品牌中。C++的表示程式碼如下:

#include <iostream>
using namespace std;

class AbstractPhoneSoftware{
public:
    virtual void RunSoftware() = 0;
    virtual ~AbstractPhoneSoftware(){}
};

class Game:public AbstractPhoneSoftware{
public:
    void RunSoftware()
    {
        cout << "Game Run" << endl;
    }
};

class Book:public
AbstractPhoneSoftware{ public: void RunSoftware() { cout << "Book Run" <<endl; } }; class AbstractPhoneBrand{ public: virtual void run() = 0; virtual void SetSoftware(AbstractPhoneSoftware *software) = 0; protected: AbstractPhoneSoftware* m_pSoftware; }; class Nokia:public
AbstractPhoneBrand{ public: void SetSoftware(AbstractPhoneSoftware *software) { m_pSoftware = software; } void run() { m_pSoftware->RunSoftware(); } }; class iPhone:public AbstractPhoneBrand { public: void SetSoftware(AbstractPhoneSoftware *software) { m_pSoftware = software; } void run() { m_pSoftware->RunSoftware(); } }; int main(int argc,char** argv) { Nokia nokia; iPhone iphone; AbstractPhoneSoftware *game = new Game(); AbstractPhoneSoftware *book = new Book(); nokia.SetSoftware(game); iphone.SetSoftware(book); nokia.run(); iphone.run(); delete game; game = nullptr; delete book; book = nullptr; return 0; }