-
桥接模式:一种结构型设计模式
-
应用场景:
一个对象由多部分属性组成,而对象与属性之间的关系,有些为has a,有些为is a,为了更灵活也更合理地实现功能,应该根据对象的组成关系将属性抽象
举例:
红色的圆可以继承自圆的抽象类,而不应继承自红色的抽象类,因为红色对它来说是一个拥有的属性。
而且,如果只通过圆的抽象类派生出一个红色圆的类,后续可能需要增加绿色圆、蓝色圆甚至绿色三角的类,交叉组合会产生非常多的类,所以这时应该考虑通过逻辑上的关系,分清is a与has a,将颜色与图形的关系抽象 -
实现方式:
首先,将颜色抽象,创建一个颜色的抽象类
然后,将颜色作为图形类的一个属性,成为图形抽象类中的一个成员变量
最后,相同形状不同颜色,通过更改图形类中的颜色变量来实现 -
优点:
将抽象和实现进行分离,使抽象不用依赖于实现,符合依赖倒置原则,降低了耦合度 -
缺点:
需要在程序设计之初就进行抽象与分离
以下是桥接模式的简单代码实现
#include <iostream>
using namespace std;
//颜色抽象类
class Color
{
public:
virtual string GetColor()=0;//获取颜色,用于验证
};
//颜色实现类
class Red:public Color
{
public:
virtual string GetColor()//获取颜色,用于验证
{
return "Red";
}
};
class Blue:public Color
{
public:
virtual string GetColor()//获取颜色,用于验证
{
return "Blue";
}
};
class Green:public Color
{
public:
virtual string GetColor()//获取颜色,用于验证
{
return "Green";
}
};
//形状抽象类
class Shape
{
public:
Shape(Color* pColor):m_pColor(pColor){}
virtual void Show()=0;//展示接口,验证实现类中颜色与形状
protected:
Color* m_pColor;//将图形的颜色抽象,与形状类桥接
};
//形状实现类
class Circle:public Shape
{
public:
Circle(Color* pColor):Shape(pColor){}//构造圆形时指定颜色
void Show()//重写展示接口,用于验证
{
cout << m_pColor->GetColor() << "Circle" << endl;
}
};
class Rectangle:public Shape
{
public:
Rectangle(Color* pColor):Shape(pColor){}//构造矩形时指定颜色
void Show()//重写展示接口,用于验证
{
cout << m_pColor->GetColor() << "Rectangle" << endl;
}
};
class Triangle:public Shape
{
public:
Triangle(Color* pColor):Shape(pColor){}//构造三角形时指定颜色
void Show()//重写展示接口,用于验证
{
cout << m_pColor->GetColor() << "Triangle" << endl;
}
};
主函数中的使用
#include <iostream>
#include "bridge.h"
using namespace std;
int main()
{
Shape* pBlueCircle = new Circle(new Blue());
pBlueCircle->Show();
return 0;
}
控制台输出结果
BlueCircle
如有错误,欢迎指正