摘要
橋接模式(Bridge pattern): 使用橋接模式通過將實現(xiàn)和抽象放在兩個不同的類層次中而使它們可以獨立改變。
一、橋接模式的意圖
橋接模式 (Bridge) 是一種結構型設計模式, 可將抽象部分與實現(xiàn)部分分離,使它們都可以獨立的變化。如果一個系統(tǒng)需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的聯(lián)系。抽象化角色和具體化角色都應該可以被子類擴展。
在這種情況下,橋接模式可以靈活地組合不同的抽象化角色和具體化角色,并獨立化地擴展。設計要求實現(xiàn)化角色的任何改變不應當影響客戶端,或者說實現(xiàn)化角色的改變對客戶端是完全透明的。
二、橋接模式的場景
- 如果你想要拆分或重組一個具有多重功能的龐雜類(例如能與多個數(shù)據(jù)庫服務器進行交互的類),可以使用橋接模式。
- 如果你希望在幾個獨立維度上擴展一個類, 可使用該模式。
- 如果你需要在運行時切換不同實現(xiàn)方法, 可使用橋接模式。
三、橋接模式的類圖
- 抽象部分 (Abstraction) 提供高層控制邏輯, 依賴于完成底層實際工作的實現(xiàn)對象。
-
實現(xiàn)部分 (Implementation) 為所有具體實現(xiàn)聲明通用接口。 抽象部分僅能通過在這里聲明的方法與實現(xiàn)對象交互。
- 抽象部分可以列出和實現(xiàn)部分一樣的方法, 但是抽象部分通常聲明一些復雜行為, 這些行為依賴于多種由實現(xiàn)部分聲明的原語操作。
- 具體實現(xiàn) (Concrete Implementations) 中包括特定于平臺的代碼。
- 精確抽象 (Refined Abstraction) 提供控制邏輯的變體。 與其父類一樣, 它們通過通用實現(xiàn)接口與不同的實現(xiàn)進行交互。
- 通常情況下, 客戶端 (Client) 僅關心如何與抽象部分合作。 但是, 客戶端需要將抽象對象與一個實現(xiàn)對象連接起來
四、橋接模式的實現(xiàn)
【Implementor】定義實現(xiàn)接口。
interface Implementor {
// 實現(xiàn)抽象部分需要的某些具體功能
public void operationImpl();
}
【Abstraction】定義抽象接口
abstract class Abstraction {
// 持有一個 Implementor 對象,形成聚合關系
protected Implementor implementor;
public Abstraction(Implementor implementor) {
this.implementor = implementor;
}
// 可能需要轉調實現(xiàn)部分的具體實現(xiàn)
public void operation() {
implementor.operationImpl();
}
}
【ConcreteImplementor】實現(xiàn) Implementor 中定義的接口
class ConcreteImplementorA implements Implementor {
@Override
public void operationImpl() {
// 真正的實現(xiàn)
System.out.println("具體實現(xiàn)A");
}
}
class ConcreteImplementorB implements Implementor {
@Override
public void operationImpl() {
// 真正的實現(xiàn)
System.out.println("具體實現(xiàn)B");
}
}
【RefinedAbstraction】擴展 Abstraction 類。
class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor implementor) {
super(implementor);
}
public void otherOperation() {
// 實現(xiàn)一定的功能,可能會使用具體實現(xiàn)部分的實現(xiàn)方法,
// 但是本方法更大的可能是使用 Abstraction 中定義的方法,
// 通過組合使用 Abstraction 中定義的方法來完成更多的功能。
}
}
public class BridgePattern {
public static void main(String[] args) {
Implementor implementor = new ConcreteImplementorA();
RefinedAbstraction abstraction = new RefinedAbstraction(implementor);
abstraction.operation();
abstraction.otherOperation();
}
}
----------------------------------------------------------
具體實現(xiàn)A
其他操作
五、橋接模式開源示例
- 使用示例: 橋接模式在處理跨平臺應用、 支持多種類型的數(shù)據(jù)庫服務器或與多個特定種類 (例如云平臺和社交網(wǎng)絡等) 的 API 供應商協(xié)作時會特別有用。
- 識別方法: 橋接可以通過一些控制實體及其所依賴的多個不同平臺之間的明確區(qū)別來進行識別。
- Java 中橋接模式應用最經(jīng)典的代表無疑是日志組件 slf4j 的橋接 jar 包。假如,你正在開發(fā)應用程序所調用的組件當中已經(jīng)使用了 common-logging,這時你需要 jcl-over-slf4j.jar 把日志信息輸出重定向到 slf4j-api,slf4j-api 再去調用 slf4j 實際依賴的日志組件。這個過程稱為橋接。下圖是官方的 slf4j 橋接策略圖:
六、橋接模式的總結
- 橋接模式通常會于開發(fā)前期進行設計,使你能夠將程序的各個部分獨立開來以便開發(fā)。另一方面,適配器模式通常在已有程序中使用,讓相互不兼容的類能很好地合作。
- 橋接、狀態(tài)模式和策略模式(在某種程度上包括適配器)模式的接口非常相似。實際上,它們都基于組合模式——即將工作委派給其他對象,不過也各自解決了不同的問題。模式并不只是以特定方式組織代碼的配方,你還可以使用它們來和其他開發(fā)者討論模式所解決的問題。
- 你可以將抽象工廠模式和橋接搭配使用。如果由橋接定義的抽象只能與特定實現(xiàn)合作,這一模式搭配就非常有用。在這種情況下,抽象工廠可以對這些關系進行封裝,并且對客戶端代碼隱藏其復雜性。
- 你可以結合使用生成器模式和橋接模式團︰主管類負責抽象工作,各種不同的生成器負責實現(xiàn)工作。
博文參考
設計模式之橋接模式 | DESIGN文章來源:http://www.zghlxwxcb.cn/news/detail-730048.html
結構型 - 橋接(Bridge) | Java 全棧知識體系文章來源地址http://www.zghlxwxcb.cn/news/detail-730048.html
到了這里,關于結構型設計模式——橋接模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!