优点:
1、Bridge 模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化。
2、桥接模式分离了抽象部分和实现部分,从而极大地提高了系统的灵活性。让抽象部分和实现部分独立开来,分别定义接口,这有助于对系统进行分层,从而产生更好的结构化的系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
3、由于桥接模式把抽象部分和实现部分分离开了,而且分别定义接口,这就使得抽象部分和实现部分可以分别独立地扩展,而不会相互影响,从而大大地提高了系统的可扩展性。
4、由于桥接模式把抽象部分和实现部分分离开了,所以在实现桥接的时候,就可以实现动态的选择和使用具体的实现。也就是说一个实现不再是固定的绑定在一个抽象接口上了,可以实现运行期间动态地切换。
缺点:
桥接功能需要使用一组接口,每实现一种业务必须先定义接口,实现桥接功能的代码量与业务复杂程度成正比。
适用性:
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2、设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3、一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
4、虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
5、一个构件具体相同的行为属性,适合于不同维度的变化(每种维度具有相同的行为)。
例子:
有电脑A和电脑B,有游戏软件CS和WC。现在A可以按装CS或WC,B也同样可以按装CS或WC。A,B能运行哪种软件,取决于,安装了哪种软件。而软件的更新品种不影响到具体的哪台电脑,电脑还是可以正常使用,而添加新电脑也不会影响到新软件的开发。各不相关。
如果想在一台电脑上按装几种软件,需要将电脑升级为多任务。即对电脑进行修改。
类图:
从类图可以看到,用户可以任意自行的将软件安在A或B。
computer.h
/**************************************************************
filename : computer.h
author: fengsh
QQ:19985430
blog :http://blog.csdn.net/fengsh998
Bridge Demo
*************************************************************/
#ifndef COMPUTER_H
#define COMPUTER_H
#include "soft.h"
class CComputer
{
public:
CComputer(void);
~CComputer(void);
virtual void setupSoft(Soft* soft)=0;
virtual void runSoft()=0;
protected:
Soft* m_soft;
};
class Lenovo : public CComputer
{
public:
Lenovo(){};
~Lenovo(){};
void setupSoft(Soft* soft);
void runSoft();
};
class Dell : public CComputer
{
public:
Dell(){};
~Dell(){};
void setupSoft(Soft* soft);
void runSoft();
};
#endif
computer.cpp
#include "StdAfx.h"
#include "computer.h"
CComputer::CComputer(void)
{
}
CComputer::~CComputer(void)
{
}
void Lenovo::setupSoft( Soft* soft )
{
m_soft = soft;
}
void Lenovo::runSoft()
{
m_soft->run();
}
void Dell::setupSoft( Soft* soft )
{
m_soft = soft;
}
void Dell::runSoft()
{
m_soft->run();
}
soft.h
/**************************************************************
filename : soft.h
author: fengsh
QQ:19985430
blog :http://blog.csdn.net/fengsh998
Bridge Demo
*************************************************************/
#ifndef SOFT_H
#define SOFT_H
class Soft
{
public:
Soft(void);
~Soft(void);
virtual void run()=0;
};
class Cs : public Soft
{
public:
Cs(){};
~Cs(){};
void run();
};
class Wc : public Soft
{
public:
Wc(){};
~Wc(){};
void run();
};
#endif
soft.cpp
#include "StdAfx.h"
#include "soft.h"
#include "iostream"
Soft::Soft(void)
{
}
Soft::~Soft(void)
{
}
void Cs::run()
{
std::cout<<"CS Run."<<std::endl;
}
void Wc::run()
{
std::cout<<"WC Run."<<std::endl;
}
客户调用演示
#include "stdafx.h"
#include "stdlib.h"
#include "computer.h"
#include "soft.h"
int _tmain(int argc, _TCHAR* argv[])
{
CComputer * lenovo = new Lenovo();
Soft * cs = new Cs();
Soft * wc = new Wc();
lenovo->setupSoft(wc);
lenovo->runSoft();
delete cs;
delete wc;
delete lenovo;
system("pause");
return 0;
}