初尝Bridge 设计模式
在奶茶店,我们经常会遇到这样的情形:老板问你,要大杯还是小杯,加椰果还是加珍珠。不难看出,这实际上是2个维度的变化。在软件开发的过程中,我们也会经常遇到类似的情形。一位吕先生的随笔里提到了关于毛笔的智慧。如果我们想要画画,用彩色笔12种颜色,就需要12支笔。但如果对笔的粗细有更精确的要求,就相应的需要增添若干倍的彩笔。例如配置一套粗彩笔,一套细彩笔就需要24支。换句话说,笔的颜色与笔的粗细高度耦合。这也是2个维度。而毛笔则将这个问题解耦,笔的粗细与颜料是可以分开变化的。转换成代码的话,原先需要2*12个类,而现在则只需要2+12(还要再+2个抽象)个类。
毛笔智慧的代码如下:
using System;
using System.Configuration;
using System.Reflection;
namespace Bridge
{
abstract class Color {
public string name;
}
abstract class Brush {
protected Color c;
public abstract void Paint();
public void SetColor(Color c) {
this.c = c;
}
}
class BigBrush : Brush {
public override void Paint() {
Console.WriteLine("Using Big Brush Paint {0}...",c.name);
}
}
class SmallBrush : Brush {
public override void Paint() {
Console.WriteLine("Using Small Brush Paint {0}...",c.name);
}
}
class Red : Color {
public Red() {
this.name = "Red";
}
}
class Green : Color {
public Green() {
this.name = "Green";
}
}
class Program
{
static void Main(string[] args)
{
//从配置文件读取设置
string bStyle = ConfigurationManager.AppSettings["BrushStyle"];
string color = ConfigurationManager.AppSettings["Color"];
//初始化
Brush b = (Brush)Assembly.Load("Bridge").CreateInstance("Bridge." + bStyle);
b.SetColor((Color)Assembly.Load("Bridge").CreateInstance("Bridge." + color));
b.Paint();
}
}
}
配置文件:
程序运行截图:
这样一来,我们能很清楚的看到Bridge 模式的优势所在了。它将2个维度的变化分开之后,让他们分别变化,大大的减少了增添新类的痛苦。用GOF中比较精炼的话说就是:将抽象部分与实现部分分离,使它们都可以独立的变化。
结构图如下:


近期评论