简单来讲,桥接模式是一个两层的抽象。
桥接模式是用于“把抽象和实现分开,这样它们就能独立变化”。 桥接模式使用了封装、聚合,可以用继承将不同的功能拆分为不同的类。
1、桥接模式的故事
电视和遥控器(图中有错字)是一个完美展示两层抽象的例子。你有一个电视机的接口,还有一个遥控器的抽象类。我们都知道,将它们中任何一个定义为一个具体类都不是好办法,因为其它厂家会有不同的实现方法。

2、桥接模式Java示例代码
首先定义电视机的接口:ITV
1
2
3
4
5
<code>public</code> <code>interface</code> <code>ITV {</code>
<code> </code><code>public</code> <code>void</code> <code>on();</code>
<code> </code><code>public</code> <code>void</code> <code>off();</code>
<code> </code><code>public</code> <code>void</code> <code>switchChannel(</code><code>int</code> <code>channel);</code>
<code>}</code>
实现三星的 ITV 接口。
6
7
8
9
10
11
12
13
14
15
16
<code>public</code> <code>class</code> <code>SamsungTV</code><code>implements</code> <code>ITV {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>on() {</code>
<code> </code><code>System.out.println(</code><code>"Samsung is turned on."</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>public</code> <code>void</code> <code>off() {</code>
<code> </code><code>System.out.println(</code><code>"Samsung is turned off."</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>switchChannel(</code><code>int</code> <code>channel) {</code>
<code> </code><code>System.out.println(</code><code>"Samsung: channel - "</code> <code>+ channel);</code>
再实现索尼的ITV接口。
17
<code>public</code> <code>class</code> <code>SonyTV</code><code>implements</code> <code>ITV {</code>
<code> </code><code>System.out.println(</code><code>"Sony is turned on."</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"Sony is turned off."</code><code>);</code>
<code> </code><code>System.out.println(</code><code>"Sony: channel - "</code> <code>+ channel);</code>
遥控器要包含对TV的引用。
18
19
20
21
22
23
<code>public</code> <code>abstract</code> <code>class</code> <code>AbstractRemoteControl {</code>
<code> </code><code>/**</code>
<code> </code><code>* @uml.property name="tv"</code>
<code> </code><code>* @uml.associationEnd </code>
<code> </code><code>*/</code>
<code> </code><code>private</code> <code>ITV tv;</code>
<code> </code><code>public</code> <code>AbstractRemoteControl(ITV tv){</code>
<code> </code><code>this</code><code>.tv = tv;</code>
<code> </code><code>public</code> <code>void</code> <code>turnOn(){</code>
<code> </code><code>tv.on();</code>
<code> </code><code>public</code> <code>void</code> <code>turnOff(){</code>
<code> </code><code>tv.off();</code>
<code> </code><code>public</code> <code>void</code> <code>setChannel(</code><code>int</code> <code>channel){</code>
<code> </code><code>tv.switchChannel(channel);</code>
定义遥控器的具体类。
<code>public</code> <code>class</code> <code>LogitechRemoteControl</code><code>extends</code> <code>AbstractRemoteControl {</code>
<code> </code><code>public</code> <code>LogitechRemoteControl(ITV tv) {</code>
<code> </code><code>super</code><code>(tv);</code>
<code> </code><code>public</code> <code>void</code> <code>setChannelKeyboard(</code><code>int</code> <code>channel){</code>
<code> </code><code>setChannel(channel);</code>
<code> </code><code>System.out.println(</code><code>"Logitech use keyword to set channel."</code><code>);</code>
<code>public</code> <code>class</code> <code>Main {</code>
<code> </code><code>public</code> <code>static</code> <code>void</code> <code>main(String[] args){</code>
<code> </code><code>ITV tv =</code><code>new</code> <code>SonyTV();</code>
<code> </code><code>LogitechRemoteControl lrc =</code><code>new</code> <code>LogitechRemoteControl(tv);</code>
<code> </code><code>lrc.setChannelKeyboard(</code><code>100</code><code>); </code>
输出如下:
<code>Sony: channel – 100</code>
<code>Logitech use keyword to</code><code>set</code> <code>channel.</code>
总结一下, 桥接模式允许两层实现的抽象,上面的电视机和遥控器就是很好的例子。可见,桥接模式提供了更多的灵活性。
参考文献
Gamma, E, Helm, R, Johnson, R, Vlissides, J著: Design Patterns, 第151页. Addison-Wesley出版社, 1995
[ 转载请保留原文出处、译者和译文链接。]
<a target="_blank" href="http://www.importnew.com/author/chenyafeng"></a>