設計模式之Bridge 模式
Bridge 模式
存在之意圖: "將抽象與現實解耦,使它們可以獨立地變化"。
Bridge 模式是最難理解的模式,部分原因是它功能非常強大,適用於多種場合。而且,它還與常見的用繼承來處理特殊情況的方式背道而馳。但是,它卻是一個遵循設計模式社區兩大原則的極好例子:「找出變化並封裝之」和「優先使用對象聚集,而不是類繼承」。
需求特點:
- 概念的抽象有變化;
- 這些概念的實現方式有變化。
要點:在需求定義期間,應該儘早而且經常地考慮變化。
UML類圖如下:
問題:一個抽象類的派生類必須使用多個實現,但它不能出現類數量爆炸性增長。
解決方案:為所有實現定義一個介面,供抽象類的所有派生類使用。
參與者與協作者:Abstraction為要實現的對象定義介面,Implementor為具體的實現類定義介面。Abstraction的派生類使用Implementor的派生類,卻無需知道自己具體使用哪一個ConcreteImplementor。
效果:實現與使用實現的對象解耦,提供了可擴展性,客戶對象無需操心實現問題。
代碼示例:
假設目前有這麼幾個類:GoogleTV 和 AppleTV,都能實現換台,與開關電視等基本功能,但是並沒有一個統一的介面,用戶其實也不care你用的是哪個TV,用戶只是單純想看芒果台而已。現在使用Bridge模式實現這個需求。
public interface TV{ public void powerON(); public void powerOff(); public void changeChannel(int channel);}public class GoogleTV implements TV{ public void powerOn(){} public void powerOff(){} public void changeChannel(int channel){}}public class AppleTV implements TV{ public void powerOn(){} public void powerOff(){} public void changeChannel(int channel){}}public abstract class TVRemoteControl{ private TV tv; public void setTV(TV tv){ this.tv = tv; } public TV getTV(){ return this.tv; } public void powerOn(){ implementor.powerOn(); } public void powerOff(){ implementor.powerOff(); } public void setChannel(int channel){ implementor.changeChannel(channel); }}public class ConcreteTVRemoteControl extends TVRemoteControl{ private int currentChannel; public void nextChannel(){ currentChannel++; setChannel(currentChannel); } public void prevChannel(){ currentChannel++; setChannel(currentChannel); }}public class BridgeTest { public static void main(String[] args) { TVRemoteControl tvBridge = new TVRemoteControl(); /*使用google TV */ GoogleTV googleTV = new GoogleTV(); tvBridge.setTV(googleTV); tvBridge.setChannel(3); /*使用 Apple TV */ GoogleTV googleTV = new GoogleTV(); tvBridge.setTV(googleTV); tvBridge.setChannel(3); }}
可結合 Strategy 、 Adapter 模式來看。
推薦閱讀:
※秦吞六國的1500年前,原汁原味的一幕就在西亞上演過……
※WebSocket 和HTTP的區別及原理
※【Vox】你知道生一個孩子要花多少錢嗎
※蘋果正在試圖掩蓋其5G數據機開發計劃的事實