定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
在实际场景中,一个对象往往会有多个纬度的属性,而这个多个维度属性组合起来才能决定这个对象。 说人话就是比如: 一个图形可以分为形状和颜色两方面来描述, 由此得出的可以有红色长方形、黑色长方形、红色圆形等等。 假如有N种形状, M种颜色, 那么会得到 MN 个图形。 放在程序中来说就会有 MN 个类, 当M和N都比较大的时候, 就会出现很多的类, 这就称作为 类爆炸。桥接模式就是用来解决类爆炸的问题的。
类图如下:
1、场景描述
现有红色矩形、黄色矩形、红色圆形、黄色圆形。采用桥接模式实现。
2、实现
/// <summary>/// 颜色抽象/// </summary>public interface IColor{/// <summary>/// 获取颜色/// </summary>string GetColor();}/// <summary>/// 具体实现-红色/// </summary>public class RedColor : IColor{public string GetColor(){return "红色";}}/// <summary>/// 具体实现-黄色/// </summary>public class YellowColor : IColor{public string GetColor(){return "黄色";}}/// <summary>/// 抽象-形状/// </summary>public abstract class AbstractShape{protected readonly IColor color;public AbstractShape(IColor color){this.color = color;}/// <summary>/// 显示具体形状/// </summary>public abstract void ShowSpecificShape();}/// <summary>/// 矩形/// </summary>public class Rectangle : AbstractShape{public Rectangle(IColor color) : base(color){}public override void ShowSpecificShape(){Console.WriteLine($"{color.GetColor()}矩形");}}/// <summary>/// 圆形/// </summary>public class Circle : AbstractShape{public Circle(IColor color) : base(color){}public override void ShowSpecificShape(){Console.WriteLine($"{color.GetColor()}圆形");}}
3、优缺点
通过以上代码可以知道,当我们需要增加一个绿色矩形的时候, 只需要添加一个对应的绿色颜色类就行了。然后客户端使用将这个颜色传入即可。 这符合开闭原则,扩展很方便。最重要的是通过抽象,然后再通过聚合颜色的方式,大大的减少了本来类的数量,避免了类爆炸。但是桥接模式的实现需要一定的抽象能力,需要正确的识别出独立变化的纬度,这也间接了增加了理解和设计难度。
4、应用场景
凡是存在两个纬度, 而且多对多的都可以考虑桥接模式。 比如: Repository 和 DB 之间的多对多。
- Repository1 —> MySQL、Oracle、SqlServer
- Repository2 —> MySQL、Oracle、SqlServer
- …..
