首页 > 设计模式 > 初尝Bridge 设计模式

初尝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运行截图 初尝Bridge 设计模式

这样一来,我们能很清楚的看到Bridge 模式的优势所在了。它将2个维度的变化分开之后,让他们分别变化,大大的减少了增添新类的痛苦。用GOF中比较精炼的话说就是:将抽象部分与实现部分分离,使它们都可以独立的变化

结构图如下:

Bridge模式 初尝Bridge 设计模式

分类: 设计模式 标签: ,
  1. 本文目前尚无任何评论.
  1. 2010年4月24日22:59 | #1
  2. 2010年5月9日19:39 | #2