天天看点

7.桥接模式(Bridge Pattern)

桥接模式

我们在用画笔画画的时候可以发现,画笔的种类有很多种,粗笔刷,细笔刷,以及硬笔刷,软笔刷等等,颜色也有很多种,红的,蓝色,绿的,紫的等等,那他们的组合就是 m*n,像这样多个维度都可以变化的例子还有很多,不同大小,颜色,字体的文字等等。若把每一种情况都单独写出来的话,工作量异常庞大,所以对于这种情况,用桥接模式就可以很好的实现。

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。
7.桥接模式(Bridge Pattern)

在类图中我们可以看到,把

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();
        }
    }
}