乐趣区

桥接模式

简介

桥接模式是将它的抽象部分和实现部分分离,使它们可以独立的变化。抽象部门和实现部分是独立的,通过它们的组合可以派生出很多不同类型的对象。在一个系统内如果有两个独立变化的维度,使用桥接模式可以减少类的数量。

UML 类图

示例

我们现在开了一个小饭店,有面包,面条,水饺,米饭还有各种菜等,看看饭店的菜单就知道有多丰盛了。饭店还提供了各种口味的,有咸的,添的,辣的等等。在这里我们把食物当作抽象部分,将口味当作实现部分。

#ifndef BRIDGE_H
#define BRIDGE_H
#include <iostream>
using namespace std;

class CFlavouring
{
public:
    virtual void Add() = 0;};

class CSalt:public CFlavouring
{
public:
    void Add(){ cout<<"Add Salt."<<endl;};
};

class CSugar:public CFlavouring
{
public:
    void Add(){cout<<"Add sugar."<<endl;};
};

class CFood
{
public:
    CFood(CFlavouring* pFlav):m_pFlav(pFlav){}
    virtual void Make() = 0; 
protected:
    CFlavouring* m_pFlav;
};

class CBread:public CFood
{
public:
    CBread(CFlavouring* pFlav):CFood(pFlav){}
    void Make()
    {
        cout<<"Make Bread."<<endl;
        m_pFlav->Add();}
};

class CNoodles:CFood
{
public:
    CNoodles(CFlavouring* pFlav):CFood(pFlav){}
    void Make()
    {
        cout<<"Make Noodles."<<endl;
        m_pFlav->Add();}
};
#endif

客户端调用,main.cpp

#include "bridge.h"
#define SAFE_DELETE(p) if(p){delete (p); (p) = 0;}

int main(int argc, char* argv[])
{
    CFlavouring* pFlavSalt = new CSalt;
    CFood* pBread = new CBread(pFlavSalt);// 这里只做出了咸味面包
    pBread->Make();
    SAFE_DELETE(pBread);
    SAFE_DELETE(pFlavSalt);
    return 0;
}
退出移动版