定义
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。也叫Handle。
结构图

理解
1. Abstraction是对外提供接口的抽象类,由客户端调用。它聚合了一个指向接口实现基类Implementor的指针。
2. Implementor是实现类的基类。它与Abstraction的接口不一定相同。一般来说,Implementor提供基本操作,Abstraction定义了基于基本操作的更高层次操作。
要点
1. 桥接模式用来解决一个模块两个维度(抽象和实现)的变化。一个维度提供抽象接口功能(Abstraction);另一个维度是抽象接口功能的实现方式也在变化(Implementor)。举例,网球游戏和羽毛球游戏是两个不同游戏;同一种游戏在PSP平台和在WII平台上的实现方式不同。
2. 桥接模式与适配器(Adapter)模式的区别。适配器模式使两个完全不同的接口实现兼容,是设计后的行为;桥接模式是设计之初就考虑到了,目的是抽象接口和实现部分可以独立的变化。
应用
在ACE中,ACE_Reactor就是桥接模式的应用。利用Bridge模式,多路复用select可以很容易实现UNIX和Windows跨平台应用。
源码中,网球游戏和羽毛球游戏是两个不同游戏(即抽象);同一种游戏在PSP平台和在WII平台上的实现方式不同。
源码
#include <iostream>
#include <string>
#include "../Singleton/Singleton.h"
using namespace std;
//具体实现. Implementor
class CGameImpl
{
public:
CGameImpl () {};
virtual ~CGameImpl(){};
virtual void PlayImpl() = 0;
};
class CPSPGameImpl : public CGameImpl
{
public:
virtual ~CPSPGameImpl(){};
virtual void PlayImpl()
{
cout << " play on psp…" << endl;
};
};
class CWIIGameImpl : public CGameImpl
{
public:
virtual ~CWIIGameImpl(){};
virtual void PlayImpl()
{
cout << " play on wii…" << endl;
};
};
//抽象接口. Abstraction
class CGame
{
public:
CGame(CGameImpl* pGameImpl)
: m_pGameImpl(pGameImpl)
{
};
virtual ~CGame() {};
virtual void Play()
{
m_pGameImpl->PlayImpl();
};
protected:
CGameImpl* m_pGameImpl;
};
class CTennisGame : public CGame
{
public:
CTennisGame(CGameImpl* pGameImpl)
: CGame(pGameImpl)
{};
virtual ~CTennisGame() {};
void Play()
{
cout << "play tennis game" << endl;
m_pGameImpl->PlayImpl();
};
};
class CBadmintonGame : public CGame
{
public:
virtual void Play()
{
cout << "play badminton game" << endl;
}
};
int main()
{
//在WII上实现网球游戏
CGameImpl* pGameImpl = new CWIIGameImpl;
CGame* pGame = new CTennisGame(pGameImpl);
pGame->Play();
delete pGameImpl;
delete pGame;
system("pause");
return 0;
}