-
橋接模式:一種結(jié)構(gòu)型設(shè)計(jì)模式
-
應(yīng)用場景:
一個(gè)對象由多部分屬性組成幢码,而對象與屬性之間的關(guān)系,有些為has a尖飞,有些為is a症副,為了更靈活也更合理地實(shí)現(xiàn)功能店雅,應(yīng)該根據(jù)對象的組成關(guān)系將屬性抽象
舉例:
紅色的圓可以繼承自圓的抽象類,而不應(yīng)繼承自紅色的抽象類瓦糕,因?yàn)榧t色對它來說是一個(gè)擁有的屬性底洗。
而且,如果只通過圓的抽象類派生出一個(gè)紅色圓的類咕娄,后續(xù)可能需要增加綠色圓亥揖、藍(lán)色圓甚至綠色三角的類,交叉組合會(huì)產(chǎn)生非常多的類圣勒,所以這時(shí)應(yīng)該考慮通過邏輯上的關(guān)系费变,分清is a與has a,將顏色與圖形的關(guān)系抽象 -
實(shí)現(xiàn)方式:
首先圣贸,將顏色抽象挚歧,創(chuàng)建一個(gè)顏色的抽象類
然后,將顏色作為圖形類的一個(gè)屬性吁峻,成為圖形抽象類中的一個(gè)成員變量
最后滑负,相同形狀不同顏色,通過更改圖形類中的顏色變量來實(shí)現(xiàn) -
優(yōu)點(diǎn):
將抽象和實(shí)現(xiàn)進(jìn)行分離用含,使抽象不用依賴于實(shí)現(xiàn)矮慕,符合依賴倒置原則,降低了耦合度 -
缺點(diǎn):
需要在程序設(shè)計(jì)之初就進(jìn)行抽象與分離
以下是橋接模式的簡單代碼實(shí)現(xiàn)
#include <iostream>
using namespace std;
//顏色抽象類
class Color
{
public:
virtual string GetColor()=0;//獲取顏色啄骇,用于驗(yàn)證
};
//顏色實(shí)現(xiàn)類
class Red:public Color
{
public:
virtual string GetColor()//獲取顏色痴鳄,用于驗(yàn)證
{
return "Red";
}
};
class Blue:public Color
{
public:
virtual string GetColor()//獲取顏色,用于驗(yàn)證
{
return "Blue";
}
};
class Green:public Color
{
public:
virtual string GetColor()//獲取顏色缸夹,用于驗(yàn)證
{
return "Green";
}
};
//形狀抽象類
class Shape
{
public:
Shape(Color* pColor):m_pColor(pColor){}
virtual void Show()=0;//展示接口痪寻,驗(yàn)證實(shí)現(xiàn)類中顏色與形狀
protected:
Color* m_pColor;//將圖形的顏色抽象,與形狀類橋接
};
//形狀實(shí)現(xiàn)類
class Circle:public Shape
{
public:
Circle(Color* pColor):Shape(pColor){}//構(gòu)造圓形時(shí)指定顏色
void Show()//重寫展示接口虽惭,用于驗(yàn)證
{
cout << m_pColor->GetColor() << "Circle" << endl;
}
};
class Rectangle:public Shape
{
public:
Rectangle(Color* pColor):Shape(pColor){}//構(gòu)造矩形時(shí)指定顏色
void Show()//重寫展示接口橡类,用于驗(yàn)證
{
cout << m_pColor->GetColor() << "Rectangle" << endl;
}
};
class Triangle:public Shape
{
public:
Triangle(Color* pColor):Shape(pColor){}//構(gòu)造三角形時(shí)指定顏色
void Show()//重寫展示接口,用于驗(yàn)證
{
cout << m_pColor->GetColor() << "Triangle" << endl;
}
};
主函數(shù)中的使用
#include <iostream>
#include "bridge.h"
using namespace std;
int main()
{
Shape* pBlueCircle = new Circle(new Blue());
pBlueCircle->Show();
return 0;
}
控制臺輸出結(jié)果
BlueCircle
如有錯(cuò)誤芽唇,歡迎指正