saville

博客园 首页 新随笔 联系 订阅 管理

一、概述
在软件开发中,我们有时候会遇上一个对象具有多个变化维度。比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车、轿车等,也可能存在不同的发动机,如汽油发动机、柴油发动机等。对这类对象,可应用桥接模式来增强系统灵活度,避免由于多维度变化带来的复杂性。
二、桥接模式
桥接模式利用对象的组合关系将不同的变化维度分离,使其可以沿着各自的维度来变化。其结构图如下:

Abstraction定义了抽象类,并包含Implementor对象。
RefinedAbstraction实现了抽象类。
Implementor定义了另一个变化维度。
ConcreteImplementor提供了第二个变化维度接口的具体实现。
三、示例
我们利用桥接模式来实现前述的汽车对象
首先定义Abstraction。

 1     public abstract class Car
 2     {
 3         public IEngine _engine;
 4 
 5         public Car(IEngine engine)
 6         {
 7             _engine = engine;
 8         }
 9 
10         public virtual void Start()
11         {
12             _engine.Start();
13         }
14 
15         public virtual void Stop()
16         {
17             _engine.Stop();
18         }
19     }

接着实现不同的汽车类型。

 1     public class Bus : Car
 2     {
 3         public Bus(IEngine engine)
 4             : base(engine)
 5         {
 6         }
 7 
 8         public override void Start()
 9         {
10             base.Start();
11             Console.WriteLine("Bus Start");
12         }
13 
14         public override void Stop()
15         {
16             base.Stop();
17             Console.WriteLine("Bus Stop");
18         }
19     }
20 
21     public class Limousine : Car
22     {
23         public Limousine(IEngine engine)
24             : base(engine)
25         {
26         }
27 
28         public override void Start()
29         {
30             base.Start();
31             Console.WriteLine("Limousine Start");
32         }
33 
34         public override void Stop()
35         {
36             base.Stop();
37             Console.WriteLine("Limousine Stop");
38         }
39     }

再定义第二个变化维度,即发动机的接口。

1     public interface IEngine
2     {
3         void Start();
4         void Stop();
5     }

最后实现不同的发动机。

 1     public class GasEngine : IEngine
 2     {
 3         public void Start()
 4         {
 5             Console.WriteLine("Gas Engine Start");
 6         }
 7 
 8         public void Stop()
 9         {
10             Console.WriteLine("Gas Engine Stop");
11         }
12     }
13 
14     public class DieselEngine : IEngine
15     {
16         public void Start()
17         {
18             Console.WriteLine("Diesel Engine Start");
19         }
20 
21         public void Stop()
22         {
23             Console.WriteLine("Diesel Engine Stop");
24         }
25     }

 

posted on 2012-12-05 18:40  saville  阅读(1534)  评论(0编辑  收藏  举报