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