桥接模式
我们在用画笔画画的时候可以发现,画笔的种类有很多种,粗笔刷,细笔刷,以及硬笔刷,软笔刷等等,颜色也有很多种,红的,蓝色,绿的,紫的等等,那他们的组合就是 m*n,像这样多个维度都可以变化的例子还有很多,不同大小,颜色,字体的文字等等。若把每一种情况都单独写出来的话,工作量异常庞大,所以对于这种情况,用桥接模式就可以很好的实现。
意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
在类图中我们可以看到,把
Color
和
PaintBrush
都改成抽象类,其他的相关的子类,继承自抽象类,而如果想要用细笔刷画画,则直接实例化一个具体的颜色,在实例化一个细笔刷,把颜色传递到细笔刷即可。
桥接(Bridge)模式的优点是:
- 抽象与实现分离,扩展能力强
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
缺点是:
- 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
完整代码如下。
using System;
namespace _07_Bridge
{
/// <summary>
/// 桥接模式
/// </summary>
class Program
{
static void Main(string[] args)
{
Color c = new Red();
PaintBrush thinBrush = new ThinBrush(c); //颜色通过构造函数传入
thinBrush.Draw();
Console.WriteLine();
}
}
//抽象类,涂颜色
abstract class Color
{
public abstract void Colour();
}
//红色类,涂颜色的实现
class Red : Color
{
public override void Colour()
{
Console.WriteLine("Red color....");
}
}
//抽象类,画画
abstract class PaintBrush
{
protected Color color;
public PaintBrush(Color c)
{
color = c;
}
public abstract void Draw();
}
//中等笔刷画画的实现
class MediumBrush:PaintBrush
{
public MediumBrush(Color c):base(c)
{
}
public override void Draw()
{
Console.WriteLine("Medium line");
color.Colour();
}
}
//细笔刷画画的实现
class ThinBrush : PaintBrush
{
public ThinBrush(Color c) : base(c)
{
}
public override void Draw()
{
Console.WriteLine("Thin line");
color.Colour();
}
}
}