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