个人理解:桥模式以装饰器模式为基础,提供了一种多对多的解决问题的抽象模式。
列举个网上常见的案例:几种画笔画用不同的颜色画画。
这里的多对多即为 多种画笔 对 多种颜色。
一般的思路为,创建一个画笔,实现多种颜色。如下:
1号笔
class CPen1
{
public:
void DrawRed(){}
void DrawGreen(){}
........
}
2号笔
class CPen2
{
public:
void DrawRed(){}
void DrawGreen(){}
........
}
如果以后要再加个颜色,那么每种笔类里都要再加代码。或者再加一只笔,那么又要去重新实现所有的颜色,重复代码较多,不方便维护。为高度耦合的状态。
所以我们将颜色和笔分成两部分以组成一个桥一样的结构。如
class PenBase
{
protected:
ColorImp *pColorImp; //抽出的颜色部分
public:
virtual void Draw() = 0; //抽出的画笔部分
.....
.....
};
实现颜色基类
class ColorImp
{
public:
virtual void Draw() = 0;
};
添加一个颜色
class Red : public ColorImp
{
public:
virtual void Draw()
{
cout << "draw red" << endl;
}
};
添加一支笔
class Pen1 : public PenBase
{
public:
Pen1(ColorImp *p)
{
pColorImp = p;
}
virtual void Draw()
{
pColorImp->Draw();
}
};
方便调用,组装成使用类
class Paint
{
protected:
PenBase *penBase;
public:
Paint(PenBase *p)
{
penBase = p;
}
void Draw()
{
penBase->Draw();
}
};
//用pen1画一个红色
int main()
{
ColorImp *pColor = new Red();
Paint paint(new Pen1(pColor));
paint.Draw();
return 0;
}
//我们后期要再加一个颜色的话。
class Green : public ColorImp
{
public:
virtual void Draw()
{
cout << "draw green" << endl;
}
};
//用pen1画一个新的颜色
int main()
{
ColorImp *pColor = new Green(); //直接改变颜色即可
Paint paint(new Pen1(pColor));
paint.Draw();
return 0;
}
//要加一个画笔
class Pen2 : public PenBase
{
public:
Pen1(ColorImp *p)
{
pColorImp = p;
}
virtual void Draw()
{
pColorImp->Draw();
}
};
//新画笔画一个颜色
int main()
{
ColorImp *pColor = new Red();
Paint paint(new Pen2(pColor));
paint.Draw();
return 0;
}
可以看到,这时候已经做到了两个方向上的分离,实现了解耦。
网友评论