(一)定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。(将一个对象多维度的变化分离)
① 桥接模式主要用意是为了实现抽象部分与实现部分脱耦,使它们各自可以独立变化。
② 在开发过程中通常会遇到一个对象有两个变化维度,而且这两个维度变化地非常剧烈,这种变化导致了纵横交错的结果,使对象的设计变得困难,并且在对象数量上和可扩展性上都带来了很大的麻烦。此时我们应当把这两个变化比较剧烈的维度拆离,然后用组合的方式把它们结合在一起。这就是桥接器模式的思想
相关模式:适配器模式,策略模式
1.1 UML定义类图
1.2 类的定义
示例
场景一:假设用蜡笔画一幅画。要使用12种颜色,且有大中小号蜡笔来画,则需要36种不同的蜡笔。但是如果我们用大中小三种不同的毛笔,再配上12种不同的颜色。则只需要12+3=15个对象就可以完成绘画。
实际上,蜡笔和毛笔的关键一个区别在于笔和颜色是否能够分离。桥梁模式的用意是“将抽象化与实现化脱耦,使得二者可以独立地变化”。关键就在于能否脱耦。蜡笔的颜色和蜡笔本身是分不开的,所以造成必须使用36支色彩、大小各异的蜡笔来绘制图画。而毛笔与颜料能够很好的脱耦,各自独立变化,便简化了操作。在这里,抽象层面的概念是:“毛笔用颜料作画”,而在实现时,毛笔有大中小三号,颜料有红绿蓝等12种,于是便可出现3*12种组合。每个参与者(毛笔与颜料)都可以在自己的自由度上随意转换。
蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建36种对象才能完成任务。桥接模式将继承关系转换为组合关系,从而降低了系统间的耦合,减少了代码编写量。
代码public abstract class Brush
{
protected Color c;
public abstract void Paint();
public Color Color
{
set { c = value; }
}
}
public class BigBrush : Brush
{
public override void Paint()
{
Console.WriteLine("使用大号毛笔和颜色:{0} 绘画", c.Name);
}
}
public class SmallBrush : Brush
{
public override void Paint()
{
Console.WriteLine("使用小号毛笔和颜色:{0} 绘画", c.Name);
}
}
public class Color
{
public string Name { get; set; }
}
public class Red : Color
{
public Red()
{
base.Name = "Red";
}
}
public class Blue : Color
{
public Blue()
{
base.Name = "Blue";
}
}
//Main客户端调用程序
static void Main(string[] args)
{
Brush brush1 = new BigBrush();
brush1.Color = new Red();
brush1.Paint();
Brush brush2 = new SmallBrush();
brush2.Color = new Blue();
brush2.Paint();
Console.ReadKey();
}