天天看点

讲故事,学(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>