旧游无处不堪寻
无寻处,惟有少年心
设计模式-桥接

桥接模式(Bridge Pattern)是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。

解释


在桥接定义中提出了抽象部分和实现部分两个术语。抽象部分(也被称为接口)是一些实体的高阶控制层。该层自身不完成任何具体的工作,它需要将工作委派给实现部分层(也被称为平台)。

注意,这里提到的内容与编程语言中的接口或抽象类无关,它们并不是一回事。

桥接模式 UML


适用场景


  1. 如果你想要拆分或重组一个具有多重功能的庞杂类,可以使用桥接模式
  2. 如果你希望在几个独立维度上扩展一个类,可使用该模式
  3. 如果你需要在运行时切换不同实现方法,可使用桥接模式

代码示例


using System;
namespace BridgePatternDemo
{
class Abstraction
{
protected IImplementation _implementation;

public Abstraction(IImplementation implementation)
{
this._implementation = implementation;
}

public virtual string Operation()
{
return "Abstract: Base operation with:\n" +
_implementation.OperationImplementation();
}
}

class ExtendedAbstraction : Abstraction
{
public ExtendedAbstraction(IImplementation implementation) : base(implementation)
{
}

public override string Operation()
{
return "ExtendedAbstraction: Extended operation with:\n" +
base._implementation.OperationImplementation();
}
}

public interface IImplementation
{
string OperationImplementation();
}

class ConcreteImplementationA : IImplementation
{
public string OperationImplementation()
{
return "ConcreteImplementationA: The result in platform A.\n";
}
}

class ConcreteImplementationB : IImplementation
{
public string OperationImplementation()
{
return "ConcreteImplementationA: The result in platform B.\n";
}
}

class Client
{
public void ClientCode(Abstraction abstraction)
{
Console.Write(abstraction.Operation());
}
}

class Program
{
static void Main(string[] args)
{
Client client = new Client();

Abstraction abstraction;

abstraction = new Abstraction(new ConcreteImplementationA());
client.ClientCode(abstraction);

Console.WriteLine();

abstraction = new ExtendedAbstraction(new ConcreteImplementationB());
client.ClientCode(abstraction);
// output

// Abstract: Base operation with:
// ConcreteImplementationA: The result in platform A.

// ExtendedAbstraction: Extended operation with:
// ConcreteImplementationA: The result in platform B.
}
}
}