这节讲桥接模式(Bridge Pattern)。
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。
为了解决上述问题,就出现了桥接模式,桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
他的优点是:抽象与实现分离,扩展能力强符合开闭原则,符合合成复用原则,实现细节对客户透明,但由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,无疑增加了系统的理解与设计难度。
下面通过包包有多种颜色为例演示一下桥接模式:
class Program { static void Main (string[] args) { new LV(new Red()).BagColor(); new LV(new Green()).BagColor(); Console.ReadKey(); } } /// <summary> /// 包包的颜色属性抽象(属性不止一种,此处为简化代码,只写一种属性的抽象) /// </summary> interface IColor { void showColor(); } /// <summary> /// 属性的实现 /// </summary> class Red:IColor { public void showColor() { Console.WriteLine("我是红色的。"); } } /// <summary> /// 属性的实现 /// </summary> class Green:IColor { public void showColor() { Console.WriteLine("我是绿色的。"); } } /// <summary> /// 包包的抽象 /// </summary> abstract class Bag { public IColor color = null; /// <summary> /// 实现不同颜色的表现 /// </summary> /// <param name="color">注入包包颜色实现</param> public Bag(IColor color) { this.color = color; } public abstract void BagColor(); } /// <summary> /// 具体的包包实现 /// </summary> class LV:Bag { public LV(IColor color) : base(color) { } public override void BagColor() { color.showColor(); } }
运行结果如下:
女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。
个人公众号,热爱分享,知识无价。