Bridge桥接模式——对象结构模式
1.意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化
2.适用性
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译
- (C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的
- 你想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点
3.结构
4.参与者
- Abstraction
—— 定义抽象类的接口
—— 维护一个指向Implementor类型对象的指针
- RefinedAbstraction
—— 扩充由Abstraction定义的接口
- Implementor
—— 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于操作的较高层次的操作
- ConcreteImplementor
—— 实现Implementor接口并定义它的具体实现。
5.效果
优点:
1)分离接口及其实现部分
2)提高可扩充性
3)实现细节对客户透明(也可以隐藏实现细节)
4)在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则
缺点:
1)增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程 正确识别出系统中两个独立变化的维度并不是一件容易的事情
6.相关模式
Abstract Factory模式可以用来创建和配置一个特定的Bridge模式。
Adapter模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。然而,Bridge模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
7.案例实现
电脑有各种品牌(联想、戴尔),每台电脑都有一个操作系统(window、linux)。定义一台电脑,使其电脑品牌和操作系统可单独选择。
#include <iostream>
using namespace std;
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:
virtual void Install(IOS* pOS)
{
cout << "Acer正在安装操作系统" << endl;
pOS->run();
}
};
int main(void)
{
IOS* pWindows = new CWindows;
IOS* pLinux = new CLinux;
IComputer* pLenvo = new CLenvo;
pLenvo->Install(pWindows);
system("pause");
return 0;
}
设计模式系列 https://blog.csdn.net/nie2314550441/article/details/105849726