橋模式
使用場景:其作用就是讓抽象與實現相分離,讓兩者都能夠各自變化。
例子:小時候家里用的是白熾燈,開關是拉線開關,隨著發展,節能燈取代白熾燈,按鈕開關取代了拉線開關。開關和燈泡的關系可以看成是繼承關系,因為開關可以看作是燈泡的一部分,燈泡完全擁有開關,如果真是使用繼承設計,那么將無法應對開關和燈泡的變遷了,看看橋模式是怎么做的。
#include <iostream>
using namespace std;
//實現化角色
//電燈
class Light
{
public:
virtual void poweroOn() = 0;
virtual void powerOff() = 0;
};
//具體實現化角色
//白熾燈
class FilamentLight :public Light
{
public:
virtual void poweroOn()
{
cout << "白熾燈打開!" << endl;
}
virtual void powerOff()
{
cout << "白熾燈關閉!" << endl;
}
};
//節能燈
class EfficientLight :public Light
{
public:
virtual void poweroOn()
{
cout << "節能燈打開!" << endl;
}
virtual void powerOff()
{
cout << "節能燈關閉!" << endl;
}
};
//抽象角色定義
//開關
class Switch
{
public:
Switch(Light *light) :m_pLight(light){}
virtual void on() = 0;
virtual void off() = 0;
void setLight(Light *light){ m_pLight = light; }
protected:
Light *m_pLight;
};
//修正抽象化角色
//拉線開關
class PullChainSwitch :public Switch
{
public:
PullChainSwitch(Light *light) :Switch(light){}
virtual void on()
{
cout << "拉線開關打開:";
m_pLight->poweroOn();
}
virtual void off()
{
cout << "拉線開關關閉:";
m_pLight->powerOff();
}
};
//按鈕開關
class ButtonSwitch :public Switch
{
public:
ButtonSwitch(Light *light) :Switch(light){}
virtual void on()
{
cout << "按鈕開關打開:";
m_pLight->poweroOn();
}
virtual void off()
{
cout << "按鈕開關關閉:";
m_pLight->powerOff();
}
};
//使用方法
int main()
{
//創建具體實現化角色
Light *filamentLight = new FilamentLight;//白熾燈
Light *efficientLight = new EfficientLight;//節能燈
//創建具體抽象化角色
Switch * pullChainSwitch = new PullChainSwitch(filamentLight);//白熾燈一般配拉線開關
pullChainSwitch->on();
//生活好了換了節能燈
pullChainSwitch->setLight(efficientLight);
pullChainSwitch->on();
//生活好了又換了按鈕開關了
Switch * buttonSwitch = new ButtonSwitch(efficientLight);
buttonSwitch->on();
return 0;
}
輸出結果:
拉線開關打開:白熾燈打開! 拉線開關打開:節能燈打開! 按鈕開關打開:節能燈打開! 請按任意鍵繼續. . .
橋梁模式是針對繼承的不足提出了,一般當繼承大于等于二層時,才考慮使用橋梁模式。此時才能顯示出抽象變化的方便。
參考:https://blog.csdn.net/a369189453/article/details/81176196
浙公網安備 33010602011771號