一、优点:
1. 将抽象部份与它的实现部份分离,使它们都可以独立地变化;遵循依赖倒置原则;
2. 将可以共享的变化部分,抽离出来,减少了代码的重复信息;
3. 桥接模式是一种很实用的结构型模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合单一职责原则。
二、原则:
设计中有超过一维的变化我们就可以用桥模式。如果只有一维在变化,那么我们用继承就可以圆满的解决问题。优先使用对象的合成/聚合将有助于保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
三、常用的场景:
1. 当一个对象有多个变化因素的时候,考虑依赖于抽象的实现,而不是具体的实现。
2. 当多个变化因素在多个对象间共享时,考虑将这部分变化的部分抽象出来再聚合/合成进来。
3. 当我们考虑一个对象的多个变化因素可以动态变化的时候,考虑使用桥接模式。
四、实例:
在不同品牌电脑上安装操作系统;不同品牌电脑可以是联想、Dell、苹果、方正、宏基等等;不同操作系统可以是windows10、Mac os、linux等等;可以将操作系统、品牌电脑按各自的方向抽象;再通过合成/聚合的方式关联起来;
//操作系统
class OS
{
public:
virtual void InstallOS_Imp() {}
};
class WindowOS: public OS
{
public:
void InstallOS_Imp() { cout<<"安装Window操作系统"<<endl; }
};
class LinuxOS: public OS
{
public:
void InstallOS_Imp() { cout<<"安装Linux操作系统"<<endl; }
};
class UnixOS: public OS
{
public:
void InstallOS_Imp() { cout<<"安装Unix操作系统"<<endl; }
};
//计算机
class Computer
{
public:
virtual void InstallOS(OS *os) {}
};
class DellComputer: public Computer
{
public:
void InstallOS(OS *os) { os->InstallOS_Imp(); }
};
class AppleComputer: public Computer
{
public:
void InstallOS(OS *os) { os->InstallOS_Imp(); }
};
class HPComputer: public Computer
{
public:
void InstallOS(OS *os) { os->InstallOS_Imp(); }
};
int main()
{
OS *os1 = new WindowOS();
OS *os2 = new LinuxOS();
Computer *computer1 = new AppleComputer();
computer1->InstallOS(os1);
computer1->InstallOS(os2);
}