索引
别名
- Handle
- Body
意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Decouple an abstraction from its implementation so that the two can vary independently.
结构
参与者
Abstraction
- 定义抽象类的接口。
- 维护一个指向 Implementor 类型对象的指针。
RefinedAbstraction
- 扩充由 Abstraction 定义的接口。
Implementor
- 定义实现类的接口,该接口不一定要与 Abstraction 接口完全一致,甚至可以完全不同。
- Implementor 接口仅提供基本操作,Abstraction 则定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor
- 实现 Implementor 接口并定义它的具体实现。
适用性
在以下情况下可以使用 Bridge 模式:
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。比如需要在程序运行时刻实现部分应可以被选择或者切换。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- 你想对客户完全隐藏抽象的实现部分。
- 类的层次需要将一个对象分解成两个部分。
- 你想在多个对象间共享实现,但同时要求客户并不知道这一点。
效果
- 分离接口及其实现部分。
- 提高可扩充性。
- 实现细节对客户透明。
相关模式
- Abstract Factory 模式可以用来创建和配置一个特定的 Bridge 模式。
- Adaptor模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。Bridge 模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
- Bridge 模式的结构与对象 Adapter 模式类似,但是 Bridge 模式的出发点不同:Bridge 目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而 Adapter 则意味着改变一个已有对象的接口。
实现
实现方式(一):使用 Bridge 模式分离抽象部分和实现部分。
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。
但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
使用 Bridge 模式,它在抽象类与它的实现直接起到了桥梁作用,使它们可以独立地变化。
namespace BridgePattern.Implementation1
{
public class Abstraction
{
protected IImplementor _implementor; public Abstraction(IImplementor implementor)
{
_implementor = implementor;
} public virtual void Operation()
{
_implementor.OperationImp1();
}
} public interface IImplementor
{
void OperationImp1();
} public class ConcreteImplementorA : IImplementor
{
public void OperationImp1()
{
// do something
}
} public class ConcreteImplementorB : IImplementor
{
public void OperationImp1()
{
// do something
}
} public class ChildAbstraction : Abstraction
{
public ChildAbstraction(IImplementor implementor)
: base(implementor)
{
} public override void Operation()
{
base.Operation();
// do some others
}
} public class Client
{
public void TestCase1()
{
IImplementor implementor1 = new ConcreteImplementorA();
IImplementor implementor2 = new ConcreteImplementorB(); Abstraction abstraction1 = new Abstraction(implementor1);
Abstraction abstraction2 = new ChildAbstraction(implementor2); abstraction1.Operation();
abstraction2.Operation();
}
}
}
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。