设计模式之美:Bridge(桥接)

索引

别名

  • 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 模式,它在抽象类与它的实现直接起到了桥梁作用,使它们可以独立地变化。

 1 namespace BridgePattern.Implementation1
 2 {
 3   public class Abstraction
 4   {
 5     protected IImplementor _implementor;
 6 
 7     public Abstraction(IImplementor implementor)
 8     {
 9       _implementor = implementor;
10     }
11 
12     public virtual void Operation()
13     {
14       _implementor.OperationImp1();
15     }
16   }
17 
18   public interface IImplementor
19   {
20     void OperationImp1();
21   }
22 
23   public class ConcreteImplementorA : IImplementor
24   {
25     public void OperationImp1()
26     {
27       // do something
28     }
29   }
30 
31   public class ConcreteImplementorB : IImplementor
32   {
33     public void OperationImp1()
34     {
35       // do something
36     }
37   }
38 
39   public class ChildAbstraction : Abstraction
40   {
41     public ChildAbstraction(IImplementor implementor)
42       : base(implementor)
43     {
44     }
45 
46     public override void Operation()
47     {
48       base.Operation();
49       // do some others
50     }
51   }
52 
53   public class Client
54   {
55     public void TestCase1()
56     {
57       IImplementor implementor1 = new ConcreteImplementorA();
58       IImplementor implementor2 = new ConcreteImplementorB();
59 
60       Abstraction abstraction1 = new Abstraction(implementor1);
61       Abstraction abstraction2 = new ChildAbstraction(implementor2);
62 
63       abstraction1.Operation();
64       abstraction2.Operation();
65     }
66   }
67 }

设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

posted @ 2014-03-22 07:29  sangmado  阅读(2765)  评论(2编辑  收藏  举报