一,动机
设想一下,如果要绘制一些图形,例如,正方形,矩形,三角形,这只需要三个类才能表示。但是,如果加上颜色呢?白色,红色,黑色。这样算下来,我们有3*3种图形,如果使用工厂模式,我们必要定义9个工厂。而假如有m个图形,n种颜色,难道去定义m*n个工厂类?
桥接模式就是针对这个问题而诞生的
二,定义
桥接模式:将抽象部分与它的实现部分 分离,使他们都可以独立的变化。
三,模式结构
1,Abstraction(抽象类)
定义了子类的接口
2,RefinedAbstraction(扩充抽象类)
实现了继承到的接口
3,Implementor(实现类接口)
定义了子类的接口
4,ConcreteImplementorA(实现A)
实现了继承到的接口,方案A
5,ConcreteImplementorB(实现B)
实现了继承到的接口,方案B
四,代码实例
下面有一个关于服装的例子详细说明。
包含有红黄黑三种颜色,有裤子和夹克两种类型。
#include <iostream>
using namespace std;
class Color
{
public:
virtual void PaintColor() = 0;
};
class Red : public Color
{
public:
void PaintColor()
{
cout<<"红色";
}
};
class Black : public Color
{
public:
void PaintColor()
{
cout<<"黑色";
}
};
class Yellow : public Color
{
public:
void PaintColor()
{
cout<<"黄色";
}
};
class Cloth
{
protected:
Color* color;
public:
void SetColor(Color* tmp)
{
color = tmp ;
}
virtual void PrintInfomation() = 0;
};
class pants : public Cloth //裤子
{
void PrintInfomation()
{
color->PaintColor();
cout<<"裤子"<<endl;
}
};
class jacket : public Cloth //裤子
{
void PrintInfomation()
{
color->PaintColor();
cout<<"夹克衫"<<endl;
}
};
int main()
{
Cloth* test = new pants();
test->SetColor(new Black());
test->PrintInfomation();
return 0;
}
输出结果为
黑色裤子
可以看出,我使用了3+2个子类 实现了3*2个不同的产品。这就是桥接模式的优点所在。