Bridge
一.意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化.
二.适用性
1. 你不希望在抽象和它的实现部分有一个固定的绑定关系.
2. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充,这是bridge模式使你可以对不同的抽象接口和实现部分进行组合并分别对它们进行扩充.
3. 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译
4. 你想对客户完全隐藏抽象的实现部分,在c++中,类的表示在类接口中是可见的
5. 有许多类要生成,这样一种类层次结构说明你必须将一个对象分解成两个部分
6. 你想在多个对象间共享实现,但同时要求客户并不知道这一点
三.优点
通过对象组合的方式,bridge模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化,这也是bridge模式的本意.将一件事物本征的东西抽象成不同的类,通过不同的类的组合描述一件事物.
四.代码
#include<iostream>
usingnamespacestd;
//bridgemode
//颜色基类
classCColor
{
public:
virtualvoiddrawColor(){}
};
classCYelloowColor:publicCColor
{
public:
virtualvoiddrawColor()
{
cout<<"yellowcolor!"<<endl;
}
};
classCBlackColor:publicCColor
{
public:
virtualvoiddrawColor()
{
cout<<"blackcolor!"<<endl;
}
};
classCWhiteColor:publicCColor
{
public:
virtualvoiddrawColor()
{
cout<<"whitecolor!"<<endl;
}
};
//自车类,包括颜色类
classCVehicle
{
protected:
CColor*m_pVehicleColor;
public:
virtualvoiddrawVehicle(){}
voidSetVehicleColor(CColor*color)
{
m_pVehicleColor=color;
}
};
classCBus:publicCVehicle
{
public:
virtualvoiddrawVehicle()
{
cout<<"bus--";
if(m_pVehicleColor!=NULL)
{
m_pVehicleColor->drawColor();
}
else
{
cout<<"donotsetcolor!"<<endl;
}
}
};
classCCar:publicCVehicle
{
public:
virtualvoiddrawVehicle()
{
cout<<"car--";
if(m_pVehicleColor!=NULL)
{
m_pVehicleColor->drawColor();
}
else
{
cout<<"donotsetcolor!"<<endl;
}
}
};
classCBike:publicCVehicle
{
public:
virtualvoiddrawVehicle()
{
cout<<"bike--";
if(m_pVehicleColor!=NULL)
{
m_pVehicleColor->drawColor();
}
else
{
cout<<"donotsetcolor!"<<endl;
}
}
};
intmain()
{
cout<<"HelloWorld!"<<endl;
CVehicle*car=newCCar();
car->SetVehicleColor(newCWhiteColor());
car->drawVehicle();
return0;
}