Bridge

Separa abstracción e implementación, así ambas pueden variar de forma independiente.

class Abstraction
{
// Fields
protected Implementor implementor;
  // Properties
  public Implementor Implementor
  {
    set{ implementor = value; }
  }
  // Methods
  virtual public void Operation()
  {
    implementor.Operation();
  }
}
// "Implementor"
abstract class Implementor
{
  // Methods
  abstract public void Operation();
}
// "RefinedAbstraction"
class RefinedAbstraction : Abstraction
{
  // Methods
  override public void Operation()
  {
    implementor.Operation();
  }
}
// "ConcreteImplementorA"
class ConcreteImplementorA : Implementor
{
  // Methods
  override public void Operation()
  {
    Console.WriteLine("ConcreteImplementorA Operation");
  }
}
// "ConcreteImplementorB"
class ConcreteImplementorB : Implementor
{
  // Methods
  override public void Operation()
  {
    Console.WriteLine("ConcreteImplementorB Operation");
  }
}
/// Client test
public class Client
{
  public static void Main( string[] args )
  {
    Abstraction abstraction = new RefinedAbstraction();
    
    // Set implementation and call
    abstraction.Implementor = new ConcreteImplementorA();
    abstraction.Operation();
    
    // Change implemention and call
    abstraction.Implementor = new ConcreteImplementorB();
    abstraction.Operation();
  }
}

A diferencia del patrón Adapter, considera como las interfaces son implementadas, en este sentido asocia abstracción y sus potenciales implementaciones. Se utiliza cuando una misma abstracción puede tener diferentes implementaciones, y todas ellas pueden evolucionar independientemente.