設計模式--結構型--橋接模式
- 橋接(Bridge)模式
- 定義
- 結構
- 案例
- 好處
- 使用場景
橋接(Bridge)模式
定義
將抽象與實現分離,使他們可以獨立變化。它是用組合關系代替繼承關系來實現,從而降低了抽象和實現這兩個維度的耦合度。
結構
- 抽象化(Abstraction)角色:定義抽象類,并包含一個對實現化對象的引用
- 擴展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實現父類中的業務方法,并通過組合關系調用實現化角色中的業務方法。
- 實現化(Implementor)角色:定義實現化角色的接口,供擴展抽象化角色調用。
- 具體實現化(Concrete Implementor)角色:給出實現化角色接口的具體實現。
案例
需要開發一個跨平臺視頻播放器,可以在不同操作系統平臺(windows,mac, linux等)上播放多種格式(rmvb,avi,wmv等)的視頻文件,該播放器包含了兩個維度,可以使用橋接模式
類圖:
/*** 視頻文件 實現化角色*/
public interface VideoFile {// 解碼方法void decode(String fileName);
}
/*** avi 視頻文件 具體的實現化角色*/
public class AviFile implements VideoFile{//@Overridepublic void decode(String fileName) {System.out.println("avi視頻文件:"+ fileName);}
}
/*** Rmvb視頻文件 具體的實現化角色*/
public class RmvbFile implements VideoFile {@Overridepublic void decode(String fileName) {System.out.println("rmvb視頻文件:" + fileName);}
}
/*** 抽象的操作系統類 抽象化角色*/
public abstract class OpratingSystem {// 聲明videoFile角色protected VideoFile videoFile;public OpratingSystem(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileName);
}
/*** 擴展抽象化角色 Windows操作系統*/
public class Windows extends OpratingSystem{public Windows(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}
public class Mac extends OpratingSystem{public Mac(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {videoFile.decode(fileName);}
}
public class Test01 {public static void main(String[] args) {// 創建mac系統對象OpratingSystem system = new Mac(new AviFile());// 使用操作系統播放視頻文件system.play("西游記");OpratingSystem system1 = new Windows(new RmvbFile());system1.play("三國演義");}
}
好處
- 橋接模式提高了系統的可擴充性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。
- 細節對客戶透明
使用場景
- 當一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展時。
- 當一個系統不希望使用繼承或因為多層繼承導致系統類的個數急劇增加時。
- 當一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活型時。避免在兩個層次之間建立靜態的繼承關系,通過橋接模式可以使他們在抽象層面建立聯系