1、结构图
2、代码
/********************************************************************
* 意图:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
*
* 适用性:
* 1、你不希望在抽象和它的实现部分之间有一个固定的绑定关系。
* 例如这种情况可能是因为,在程序运行时刻实现部分应可以
* 被选择或者切换。
* 2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
* 这时B r i d g e 模式使你可以对不同的抽象接口和实现部分进
* 行组合,并分别对它们进行扩充。
* 3、对一个抽象的实现部分的修改应对客户不产生影响,即客户的代
* 码不必重新编译。
* 4、你想对客户完全隐藏抽象的实现部分。类的表示在类接口中是可见的。
* 5、有许多类要生成。这样一种类层次结构说明你必须将一个对象分解成两
* 个部分。Rumbaugh 称这种类层次结构为“嵌套的普化”
* (nested generalizations )。
* 6、你想在多个对象间共享实现(可能使用引用计数),但同时要求客户
* 并不知道这一点。一个简单的例子便是Coplien 的String类[Cop92],
* 在这个类中多个对象可以共享同一个字符串表示(StringRep)。
*
*协作:Abstraction将Client的请求转发给它的Implementor对象。
*
* 作者:董怀信
* 日期:2009-05-30
* ******************************************************************/
using System;
namespace DesignPattern.StructuralPattern.Bridge
{
/// <summary>
/// 定义抽象类的接口。
/// 维护一个指向Implementor类型对象的指针。
/// </summary>
public abstract class Abstraction
{
protected Implementor m_implementor;
public abstract void Operation();
}
/// <summary>
/// 扩充由Abstraction定义的接口。
/// </summary>
public class RefinedAbstraction:Abstraction
{
public RefinedAbstraction(Implementor implementor)
{
this.m_implementor = implementor;
}
public override void Operation()
{
Console.WriteLine("RefinedAbstraction:Start");
m_implementor.OperationImp();
Console.WriteLine("RefinedAbstraction:End");
}
}
/// <summary>
/// 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;
/// 事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,
/// 而Abstraction则定义了基于这些操作的较高层次的操作。
/// </summary>
public abstract class Implementor
{
public abstract void OperationImp();
}
/// <summary>
/// 实现Implementor接口并定义它的具体实现。
/// </summary>
public class ConcreteImplementorA:Implementor
{
public override void OperationImp()
{
Console.WriteLine("ConcreteImplementorA:OperationImp()");
}
}
public class ConcreteImplementorB : Implementor
{
public override void OperationImp()
{
Console.WriteLine("ConcreteImplementorB:OperationImp()");
}
}
/// <summary>
/// 测试客户
/// </summary>
public class Client
{
public void Test()
{
Implementor implementor = new ConcreteImplementorA();
Abstraction abstraction = new RefinedAbstraction(implementor);
abstraction.Operation();
}
}
}