C++设计模式-桥接

来源:互联网 发布:笔记本怎么查看mac地址 编辑:程序博客网 时间:2024/05/01 14:07

定义

桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。也叫Handle
结构图
理解
1.       Abstraction是对外提供接口的抽象类,由客户端调用。它聚合了一个指向接口实现基类Implementor的指针。
2.       Implementor是实现类的基类。它与Abstraction的接口不一定相同。一般来说,Implementor提供基本操作,Abstraction定义了基于基本操作的更高层次操作。
 
要点
1.       桥接模式用来解决一个模块两个维度(抽象和实现)的变化。一个维度提供抽象接口功能(Abstraction);另一个维度是抽象接口功能的实现方式也在变化(Implementor)。举例,网球游戏和羽毛球游戏是两个不同游戏;同一种游戏在PSP平台和在WII平台上的实现方式不同。
2.       桥接模式与适配器(Adapter)模式的区别。适配器模式使两个完全不同的接口实现兼容,是设计后的行为;桥接模式是设计之初就考虑到了,目的是抽象接口和实现部分可以独立的变化。
 
应用
ACE中,ACE_Reactor就是桥接模式的应用。利用Bridge模式,多路复用select可以很容易实现UNIXWindows跨平台应用。
源码中,网球游戏和羽毛球游戏是两个不同游戏(即抽象);同一种游戏在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;
}
原创粉丝点击