《大話設計模式》讀書筆記之C++實現--chapter22橋接模式
阿新 • • 發佈:2019-02-15
橋接模式的核心在於理解好繼承屬於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;
}