定义
桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。也叫Handle
。
结构图
![](http://hi.csdn.net/attachment/201005/14/0_1273825799n8O8.gif)
理解
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;
}