目录
一、桥接模式的思想
二、使用案例
1、不使用设计模式实现
1.1 代码示例
1.2 缺点
2、采用桥接设计模式
2.1、类图结构
2.2、代码示例
一、桥接模式的思想
• 现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备
3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型
号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。
• 实际上,蜡笔和毛笔的关键一个区别就在于笔和颜色是否能够分离。即将抽象化
(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化"。关键就在于能否
脱耦。蜡笔的颜色和蜡笔本身是分不开的,所以就造成必须使用15支色彩、大小各异的蜡笔
来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象
层面的概念是:"毛笔用颜料作画",而在实现时,毛笔有大中小三号,颜料有红绿蓝黑白等
5种,于是便可出现3×5种组合。每个参与者(毛笔与颜料)都可以在自己的自由度上随意
转换。
• 蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建
15种对象才能完成任务。
• Bridge模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。
一维变化用继承、多维变化用桥接
二、使用案例
操作系统的组装。
1、不使用设计模式实现
1.1 代码示例
#include <iostream>
using namespace std;
class Computer {
public:
void run();
};
class HpWindows7 :public Computer {
};
class HpWindow8 :public Computer {
};
class HpWindowsX :public Computer {
};
1.2 缺点
类膨胀
2、采用桥接设计模式
2.1、类图结构
2.2、代码示例
class IOS {
public:
IOS(){}
virtual ~IOS()
{
}
virtual void run() = 0;
};
class CWindows :public IOS {
public:
virtual void run() {
cout << "Windows 正在运行" << endl;
}
};
class CLinux :public IOS {
public:
virtual void run() {
cout << "Linux 正在运行" << endl;
}
};
class IComputer {
public:
virtual void Install(IOS *pOS) = 0; //建立桥
};
class CLenvo :public IComputer {
public:
virtual void Install(IOS *pOS) {
cout << "Lenvo正在安装操作系统" << endl;
pOS->run();
}
};
class CDell :public IComputer {
public:
virtual void Install(IOS *pOS) {
cout << "Dell正在安装操作系统" << endl;
pOS->run();
}
};
class CAcer:public IComputer
{
public:
public:
virtual void Install(IOS *pOS) {
cout << "Acer正在安装操作系统" << endl;
pOS->run();
}
private:
};
int main(void) {
IOS* pWindows = new CWindows;
IOS* pLinux = new CLinux;
IComputer* pLenvo = new CLenvo;
pLenvo->Install(pWindows);
system("pause");
return 0;
}