这节讲桥接模式(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();
}
}
// 包包的颜色属性抽象(属性不止一种,此处为简化代码,只写一种属性的抽象)
interface IColor
{
void showColor();
}
// 属性的实现
class Red:IColor
{
public void showColor()
{
Console.WriteLine("我是红色的。");
}
}
// 属性的实现
class Green:IColor
{
public void showColor()
{
Console.WriteLine("我是绿色的。");
}
}
// 包包的抽象
abstract class Bag
{
public IColor color = null;
/// <summary>
/// 实现不同颜色的表现
/// </summary>
/// <param name="color">注入包包颜色实现</param>
public Bag(IColor color)
{
this.color = color;
}
public abstract void BagColor();
}
/// 具体的包包实现
class LV:Bag
{
public LV(IColor color) : base(color){}
public override void BagColor()
{
color.showColor();
}
}
运行结果如下:
女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。
本节到此结束...