桥接模式
一杯咖啡为例,子类实现类为四个:中杯加奶、大杯加奶、 中杯不加奶、大杯不加奶。
但是,我们注意到:上面四个子类中有概念重叠,可从另外一个角度进行考虑,这四个类实际是两个角色的组合:抽象 和行为,其中抽象为:中杯和大杯;行为为:加奶不加奶(如加橙汁 加苹果汁).
实现四个子类在抽象和行为之间发生了固定的绑定关系,如果以后动态增加加葡萄汁的行为,就必须再增加两个类:中杯加葡萄汁和大杯加葡萄汁。显然混乱,扩展性极差。那我们从分离抽象和行为的角度,使用Bridge模式来实现。
特点:将抽象部分与实现部分分离,使它们可以独立变化。
实现代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//奶
class HandsetSoft
{
public:
virtual void MixMilk()=0;
};
//加奶
class HandsetGame : public HandsetSoft
{
public:
virtual void MixMilk()
{
cout<<"加奶"<<endl;
}
};
//不加奶
class HandSetAddressList : public HandsetSoft
{
public:
virtual void MixMilk()
{
cout<<"不加奶"<<endl;
}
};
//杯
class HandsetCup
{
protected:
HandsetSoft* m_soft;
public:
void SetHandsetSoft(HandsetSoft* temp)
{
m_soft = temp;
}
virtual void MixMilk()=0;
};
//小杯
class HandsetCupM : public HandsetCup
{
public:
virtual void MixMilk()
{
cout<<"小杯";
m_soft->MixMilk();
}
};
//大杯
class HandsetCupN : public HandsetCup
{
public:
virtual void MixMilk()
{
cout<<"大杯";
m_soft->MixMilk();
}
};
//客户端
int main()
{
HandsetCup *brand;
brand = new HandsetCupM();
brand->SetHandsetSoft(new HandsetGame());
brand->MixMilk();
brand->SetHandsetSoft(new HandSetAddressList());
brand->MixMilk();
return 0;
}