簡單來講,橋接模式是一個兩層的抽象。
橋接模式是用于“把抽象和實作分開,這樣它們就能獨立變化”。 橋接模式使用了封裝、聚合,可以用繼承将不同的功能拆分為不同的類。
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>