定义

  1. 将抽象部分 和 实现部分分离,使它们都可以独立的变化
  2. 这里的实现是指抽象类和它的派生类用来实现自己的对象,即实现系统可能有多个角度的分类,每个分类都有可能变化,那么就把多个角度分离出来让它们独立变化,减少它们之间的耦合

使用场景

  1. 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式

    1. 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
    2. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
    3. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展
  2. 关键点,多维度

    1. 不同厨师炒不同的菜(可能存在相同)
    2. 不同的游戏平台出售不同的游戏(可能存在相同)

比较传统的类继承 - 桥接模式

  1. 传统类继承是强耦合关系,符合开放-封闭原则 却 违背了 单一 职责原则,多重继承会导致一个类的变化引起派生类的变化。且可能会出现重复代码,类的结构过于复杂,继承关系太多,难于维护,最后最致命的一点是扩展性太差。而且类的结构会随着功能变得更庞大
  2. 桥接模式 属于弱耦合关系,各个维度独自变化,这样可以避免重复代码(不同维度的可能出现),且也避免不好扩展,而且也不会随着功能使结构变得更庞大

代码实现

//执行者
abstract class Implementor
{
      public abstract void Operation();
}

//具体执行者A
class ConcreteImplementorA: Implementor
{
     public override void Operaion()
     {
           Console.WriteLine("具体实现方法A执行");
     }
}

//具体执行者B
class ConcreteImplementorB: Implementor
{
     public override void Operaion()
     {
           Console.WriteLine("具体实现方法B执行");
     }
}


//抽象类 桥可以有多个
class Abstraction
{
      protected Implementor implementor;   //桥 1


      public void SetImplementor(Implementor implementor)   //搭桥
      {
          this.implementor = implementor;
      }

      public virtual void Operation() //执行桥方法
      {
           implementor.Operation();
      }
}

//具体类 可以有多个
class RefinedAbstraction: Abstraction
{
     public overridee void Operaion()
     {
            implementor.Operation();
     }
}

void Main()
{
    Abstraction ab = new RefinedAbstraction();
    ab.SetImplementor(new ConcreteImplementorA());
    ab.Operation();

    ab.SetImplementor(new ConcreteImplementorB());
    ab.Operation(); 

}

优点&缺点

  1. 抽象和实现的分离。
  2. 优秀的扩展能力。
  3. 实现细节对客户透明。
  4. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程