一、定義
橋樑模式(Bridge Pattern)也叫做橋接模式,是一個比較簡單的模式,將抽象和實現解耦,使得二者可以獨立的變化。
橋樑模式的重點是“解耦”,如何讓它們兩者解耦是我們要了解的重點;
二、代碼演示
2.1 通用類圖
2.2 角色說明
- Abstraciton–抽象化角色
它主要職責是定義出該角色的行爲,同事保存一個對實現化角色的引用,該角色一般是抽象類。 - Implementor–實現化角色
它是接口或抽象類,定義角色必須的行爲和屬性。 - RefinedAbstraciton–修正抽象化角色
它引用實現化角色對象化角色進行修正。 - ConcreteImplementor-具體實現化角色
它實現接口或抽象類定義的方法和屬性。
大家記住一句話:抽象角色引用實現角色,或抽象角色部分功能由實現角色完成。
2.3 實現化角色
package com.design.bridge.pattern;
/**
* @description 實現化角色
* @date: 2019/9/28 20:13
* @version: v 0.1
*/
public interface Implementor {
public void doSomething();
public void doAnything();
}
2.4 具體實現化角色
package com.design.bridge.pattern;
/**
* @description 具體實現化角色
* @date: 2019/9/28 20:21
* @version: v 0.1
*/
public class ConcreteImplementor1 implements Implementor {
public void doSomething() {
//業務邏輯處理
System.out.println("ConcreteImplementor1 doSomething");
}
public void doAnything() {
//業務邏輯處理
System.out.println("ConcreteImplementor1 doAnything");
}
}
package com.design.bridge.pattern;
/**
* @description 具體實現化角色
* @date: 2019/9/28 20:21
* @version: v 0.1
*/
public class ConcreteImplementor2 implements Implementor {
public void doSomething() {
//業務邏輯處理
System.out.println("ConcreteImplementor2 doSomething");
}
public void doAnything() {
//業務邏輯處理
System.out.println("ConcreteImplementor2 doAnything");
}
}
上面定義了兩個具體實現化角色—代表兩個不同的業務邏輯。
2.5 抽象化角色
package com.design.bridge.pattern;
/**
* @description 抽象化角色
* @date: 2019/9/28 20:26
* @version: v 0.1
*/
public class Abstraction {
//定義對實現角色的引用
private Implementor imp;
//約束子類必須實現該構造函數
public Abstraction(Implementor _imp) {
this.imp = _imp;
}
//自身行爲和屬性
public void request() {
this.imp.doSomething();
}
//獲取實現化角色
public Implementor getImp() {
return imp;
}
}
爲什麼要增加一個構造函數呢 ?答案是爲了提醒子類,必須做這項工作。
2.6 具體抽象化角色
package com.design.bridge.pattern;
/**
* @description 具體抽象化角色
* @date: 2019/9/28 20:29
* @version: v 0.1
*/
public class RefindAbstraction extends Abstraction {
//覆寫構造函數
public RefindAbstraction(Implementor _imp) {
super(_imp);
}
//修正父類的行爲
@Override
public void request() {
//業務處理
super.request();
super.getImp().doAnything();
}
}
實現化角色有很多子接口,如果在構造函數中不傳一個儘量明確的實現者,代碼就很不清晰。
2.7 運行結果
ConcreteImplementor1 doSomething
ConcreteImplementor1 doAnything
三、優點
抽象與實現分離
這是橋樑模式的主要特點,它是爲了解決繼承缺點而提出的設計模式,在該模式中,實現可以不受抽象的約束,不用再綁定在一個固定的抽象層次上。
優秀的擴展能力
可以增加抽象,只要對外暴露的接口允許這樣的變化。
實現細節對象客戶透明
客戶不用關係細節的實現,它已經抽象層通過聚合關係完成封裝。
四、缺點
可能會出現,子類太多導致,類膨脹。
五、應用場景
- 不希望或不適合使用繼承使用場景
例如繼承的過渡,無法更細化設計等場景,需要考慮用橋樑模式。 - 接口或抽象類不穩定的場景
接口不穩定還想通過實現或集成來實現業務需求的場景。 - 重用性要求較高的場景
設計的粒度越細,則被重用的可能性越大。
六、注意事項
橋樑模式非常簡單,使用該模式,主要考慮怎樣拆分抽象和實現,橋樑模式的意圖是對變化的封裝,儘量可能變化的部分封裝爲最小,避免風險擴散。如果發現系統設計時,類的繼承有N層時,可以考慮使用橋樑模式。