一、模式介绍
GOF 在《设计模式》中给桥梁模式的定义为:将抽象部分与它的实现部分分离,使它 们都可以独立地变化。这里的抽象部分和实现部分不是我们通常认为的父类与子类、接口与 实现类的关系,而是组合关系。也就是说,实现部分是被抽象部分调用,以用来完成(实现) 抽象部分的功能
简单来说,桥梁模式就是为了降低耦合,让抽象与实现相分离,使得两者都能够各自变化
二、例子实现
假设我现在有两台电脑,一台是预装windows系统的,一台是预装ios系统的,其实可以用继承来实现不同的电脑和系统,但是如果是我要生产出3个品牌的电脑,然后每个品牌的电脑有3个不同的系统进行预售,很好理解,如果是继承的方式,我们需要9个子类,但是如果是采用了桥梁的模式,我们就只需要6个子类即可。下面我们来看一个简单的例子:
我们需要有一个Computer的父类,来定义每一台电脑公共的属性,另外,还需要有一个OS的类来实现每一台电脑预装的系统:
class OS;
class Computer
{
public:
Computer(){};
virtual ~Computer(){};
virtual void InstallOS(OS *os) = 0;
protected:
OS *operaSystem;
};
class Apple :public Computer
{
public :
Apple();
~Apple();
void InstallOS(OS *os);
};
class Microsoft :public Computer
{
public:
Microsoft();
~Microsoft();
void InstallOS(OS *os);
};
class OS
{
public:
OS(){};
virtual ~OS(){};
virtual void Work() = 0;
};
class Windows :public OS
{
public:
Windows();
~Windows();
void Work();
};
class IOS :public OS
{
public:
IOS();
~IOS();
void Work();
};
下面是实现的部分:
IOS::IOS() :OS()
{
}
IOS::~IOS()
{
}
void IOS::Work()
{
cout << "I'm working with IOS " << endl;
}
Windows::Windows() :OS()
{
}
Windows::~Windows()
{
}
void Windows::Work()
{
cout << "I'm working with Windows " << endl;
}
Apple::Apple() :Computer()
{
cout << "I'm Mac!" << endl;
}
Apple::~Apple()
{
if (operaSystem)
delete operaSystem;
}
void Apple::InstallOS(OS *os)
{
operaSystem = os;
operaSystem->Work();
}
Microsoft::Microsoft() :Computer()
{
cout << "I'm Microsoft!" << endl;
}
Microsoft::~Microsoft()
{
if (operaSystem)
delete operaSystem;
}
void Microsoft::InstallOS(OS *os)
{
operaSystem = os;
operaSystem->Work();
}
接下来是调用部分:
#include "OS.h"
#include "Computer.h"
int main()
{
Computer *lenovo = new Microsoft();
lenovo->InstallOS(new Windows());
Computer *Mac = new Apple();
Mac->InstallOS(new IOS());
delete lenovo;
delete Mac;
getchar();
}
这样就实现了抽象和实现的分离,关于这次的代码,可以到github上下载:
这里写链接内容