天天看點

講故事,學(Java)設計模式—橋接模式講故事,學(Java)設計模式—橋接模式

簡單來講,橋接模式是一個兩層的抽象。

橋接模式是用于“把抽象和實作分開,這樣它們就能獨立變化”。 橋接模式使用了封裝、聚合,可以用繼承将不同的功能拆分為不同的類。

1、橋接模式的故事

電視和遙控器(圖中有錯字)是一個完美展示兩層抽象的例子。你有一個電視機的接口,還有一個遙控器的抽象類。我們都知道,将它們中任何一個定義為一個具體類都不是好辦法,因為其它廠家會有不同的實作方法。

講故事,學(Java)設計模式—橋接模式講故事,學(Java)設計模式—橋接模式

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

講故事,學(Java)設計模式—橋接模式講故事,學(Java)設計模式—橋接模式

[ 轉載請保留原文出處、譯者和譯文連結。]

<a target="_blank" href="http://www.importnew.com/author/chenyafeng"></a>