首页 > 代码库 > 桥接模式<Bridge>

桥接模式<Bridge>

概述

  将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化。

解决

  在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式。

角色

  抽象(Abstraction):定义抽象接口,该接口中包含(保持)实现具体行为、具体特征的实现(Implementor)接口。

  提炼的抽象(RefinedAbstraction):继承自Abstraction的子类,依旧是一个抽象的事物名。

  实现(Implementor):定义具体行为,具体特征的应用接口

  具体实现(ConcreteImplementor):实现Implementor。

解读

  Bridge模式使用“对象间的组合/聚合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化

  UML

  C#代码

 1     /// <summary>
 2     /// 抽象
 3     /// </summary>
 4     public abstract class Abstraction
 5     {
 6         protected Implementor implementor;
 7 
 8         public abstract void Opration ();
 9 
10         public void SetImplementor(Implementor implenentor)
11         {
12             this.implementor = implenentor;
13         }
14     }
15 
16     /// <summary>
17     /// 被提炼的抽象
18     /// </summary>
19     public class RefinedAbstraction:Abstraction
20     {
21         public override void Opration ()
22         {
23             implementor.Opration ();
24         }
25     }
26 
27     /// <summary>
28     /// 实现
29     /// </summary>
30     public interface Implementor
31     {
32         void Opration();
33     }
34 
35     /// <summary>
36     /// 具体的实现A
37     /// </summary>
38     public class ConcreteImplementorA : Implementor
39     {
40         public void Opration ()
41         {
42             Console.WriteLine ("具体实现A");
43         }
44     }
45 
46     /// <summary>
47     /// 具体的实现B
48     /// </summary>
49     public class ConcreteImplementorB : Implementor
50     {
51         public void Opration ()
52         {
53             Console.WriteLine ("具体实现B");
54         }
55     }
View Code

 

总结

  优点:

    降低了沿着两个或多个维度扩展时的复杂度,防止类的过度膨胀

    解除了两个或多个维度之间的耦合,使它们沿着各自方向变化而不互相影响

  适用:

    当一个对象有多个变化因素时,可以考虑使用桥接模式,通过抽象这些变化因素,将依赖具体实现修改为依赖抽象

    当我们期望一个对象的多个变化因素可以动态变化,而且不影响客户端的程序使用时

    如果使用继承的实现方案,会导致产生很多子类,任何一个变化因素都需要产生多个类来完成,就要考虑桥接模式。

随记

  将角色之间的继承关系改成聚合关系

  在抽象中保持对实现的引用,在提炼的抽象中使用实现,抽象中的事件方法可以与实现的方法不同