Java设计模式——桥模式
概述
橋模式(Bridge)是為了解決將抽象部分與實現(xiàn)部分分離,好讓他們都在自己的維度上有多維度地變化。這句話是好理解的,只是我在學習完橋模式之后,存在一些疑問,還好現(xiàn)在想通了。現(xiàn)在我就橋模式的設計思想和我的疑問一并發(fā)出,希望于你有益。
版權說明
著作權歸作者所有。
商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處。
本文作者:Coding-Naga
發(fā)表日期: 2016年3月31日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51024127
來源:CSDN
更多內(nèi)容:分類 >> 設計模式
場景
現(xiàn)假設市面上有多種不同型號的電視機,和一些不同的遙控器生產(chǎn)產(chǎn)商。遙控器生產(chǎn)產(chǎn)商要為這些電視機進行生產(chǎn)遙控器,可是這些電視機型號太多,有一些電視機的型號太雜,甚至在后期會出現(xiàn)一些不同型號的電視機。
普通聚合方案
在這個一般方案中,遙控器產(chǎn)商要為每一種電視機生產(chǎn)一種遙控器。類圖如下
每個具體的遙控器都去繼承或是實現(xiàn)遙控器的抽象或是接口,并且在每個具體的遙控器內(nèi)部都聚合了各自的電視機接口。這種方案可以解決問題,可以解決遙控器與電視機的對應關系。可是,卻有一個問題,就像上面場景中所說的,如果這里的有一些新的電視機出現(xiàn),那么生產(chǎn)遙控器的產(chǎn)商還得去生產(chǎn)新的遙控器。這樣一來各自的遙控器數(shù)量不但不好把握,而且這樣的設計很繁雜。
橋模式
上面一般的聚合方案無法解決遙控器的一般性,對于新的機型無法兼容和適應。對于這樣在抽象或是實現(xiàn)上會有多維度擴展的情況,我們就必須重新設計代碼結構了。下面是橋模式,以及橋模式是如何解決這個問題的。
定義
將抽象部分(Abstraction)與實現(xiàn)部分(Implementor)分離,使它們可以獨立地變化。
分析
橋模式的應用場景是某一個抽象或是實現(xiàn)可能存在多維度的變化。就像上面的遙控器實例,我們在遙控器這個抽象上,可能會有不同的生產(chǎn)產(chǎn)商;在電視機這個實現(xiàn)上可能會RCA、Sony等等。橋模式可以讓遙控器的抽象和電視機的實現(xiàn)在各自的方向上多維度變化,而不用關心其他的事情。
在上面我也分析了一般的聚合方案是不可靠的,它的確可以解決一些問題,可是卻是繁瑣的,也是不必要的。
這里再說一個大家可能都比較熟悉的例子。比如我們現(xiàn)在編寫的Java程序,與運行平臺之間的關系。我們可以有很多很多的Java程序,而運行平臺也可以是Windows、Linux或是Mac。我們的Java程序需要在所有的平臺上能夠執(zhí)行,每一個平臺也要保證能夠全部的Java程序。
類圖
這里我們讓遙控器的抽象類聚合電視機的接口。因為所以的電視都實現(xiàn)電視機這個接口,那么遙控器的抽象類也就聚合了所有的電視機實現(xiàn)。這樣不管你電視機的型號如何改變,遙控器都可以不做修改也能繼續(xù)工作。
注:當時我在這里存在一個小疑問,為什么我們的電視機接口不是聚合到遙控器的子類中,而是聚合到遙控器的抽象類中呢?也就是說,這里我有沒有必要有一個遙控器的抽象類?
現(xiàn)在我假設這里不存在這個RemoteControl的抽象類,那么ConcreteRemote將持有TV這個接口,可是這樣在遙控器這個維度上都不好擴展了。橋模式的牛X之處就在于它可以讓多維度的抽象和實現(xiàn)都可以在多維度上進行任意擴展。
邏輯實現(xiàn)
基于上面的類圖,可編寫Java代碼。
TV.java
public interface TV {public void on();public void off();public void tuneChannel(int channel); }RCA.java
public class RCA implements TV {@Overridepublic void on() {System.out.println("RCA被打開了");}@Overridepublic void off() {System.out.println("RCA被關閉了");}@Overridepublic void tuneChannel(int channel) {System.out.println("切換到第" + channel + "頻道了");} }Sony.java
public class Sony implements TV {@Overridepublic void on() {System.out.println("Sony被打開了");}@Overridepublic void off() {System.out.println("Sony被打開了");}@Overridepublic void tuneChannel(int channel) {System.out.println("切換到第" + channel + "頻道了");} }RemoteControl.java
public abstract class RemoteControl {protected TV tv = null;public RemoteControl(TV _tv) {this.tv = _tv;}public abstract void on();public abstract void off();public void setChannel(int channel) {if (tv != null) {tv.tuneChannel(channel);}} }ConcreteRemote.java
public class ConcreteRemote extends RemoteControl {private int currentStation = 0;private final int MAX_STATION = 25;public ConcreteRemote(TV _tv) {super(_tv);}@Overridepublic void on() {tv.on();}@Overridepublic void off() {tv.off();}public void setChannel(int channel) {currentStation = channel;super.setChannel(currentStation);}public void nextChannel() {currentStation = (MAX_STATION + currentStation + 1) % MAX_STATION;super.setChannel(currentStation);}public void previousChannel() {currentStation = (MAX_STATION + currentStation - 1) % MAX_STATION;super.setChannel(currentStation);} }模式評價
| 電視機的實現(xiàn)被解耦,它和遙控器之間不再永久綁定 | 相對比較復雜 |
| 遙控器和電視機可以獨立擴展,且不會影響對方 |
Ref
- 《Head First設計模式》
Github源碼鏈接
https://github.com/qwhai/design-pattern
征集
如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行注冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d
總結
以上是生活随笔為你收集整理的Java设计模式——桥模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全排列算法的全面解析
- 下一篇: Java 多线程之 synchroniz