一,什麼是橋接模式
Bridge 模式 又叫橋接模式,是構造型的設計模式之一。 Bridge 模式 基於 類的最小設計原則,通過封裝,聚合以及繼承等行爲來讓不同的類承擔不同的責任, 它的主要特點是把抽象 與行爲 實現 分離開來,從而可以保持各部分的獨立性以及應對它們的功能擴展。
二,橋接模式的結構
橋接(Bridge) 模式包含以下主要角色
- 抽象化(Abstraction)角色:定義抽象類,幷包含一個對實現化對象的引用。
- 擴展抽象化(Refined Abstraction)角色:是抽象化角色的子類,實現父類中的業務方法,並通過組合關係調用實現化角色中的業務方法。
- 實現化(Implementor)角色:定義實現化角色的接口,供擴展抽象化角色調用。
- 具體實現化(Concrete Implementor)角色:給出實現化角色接口的具體實現。
優點:
- 由於抽象與實現分離,所以擴展能力強;
- 其實現細節對客戶透明。
缺點: 由於聚合關係建立在抽象層,要求開發者針對抽象化進行設計與編程,這增加了系統的理解與設計難度。
三,代碼實現
定義實現化角色的接口,供擴展抽象化角色調用。
/**
* @Description: 抽象的接口,負責 抽象的一些行爲
* @param:
* @return:
**/
public interface Engine {
/**
* 安裝發動機
*/
public void installEngine();
}
給出實現化角色接口的具體實現。
public class Engine2000 implements Engine{
@Override
public void installEngine() {
System.out.println("安裝2000cc發動機");
}
}
public class Engine2200 implements Engine{
@Override
public void installEngine() {
System.out.println("安裝2200cc發動機");
}
}
抽象類,幷包含一個對實現化對象的引用。做橋接,使擁有同樣的接口,不同的引用
public abstract class Car implements Engine{
protected Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
@Override
public abstract void installEngine();
}
抽象化角色的子類,實現父類中的業務方法,並通過組合關係調用實現化角色中的業務方法。
public class Bus extends Car{
public Bus(Engine engine) {
super(engine);
}
@Override
public void installEngine() {
System.out.println("給Bus裝上:");
engine.installEngine();
}
}
public class Jeep extends Car {
public Jeep(Engine engine) {
super(engine);
}
@Override
public void installEngine() {
System.out.println("給Jeep裝上:");
engine.installEngine();
}
}
測試:
public class MainClass {
public static void main(String[] args) {
/* Implementor imple = new ConcreteImplementorA();
Abstraction abs = new RefinedAbstraction(imple);
abs.Operation();*/
//具體的實現
Engine engine = new Engine2000();
Car car = new Bus(engine);
car.installEngine();
Engine engine1 = new Engine2200();
Car car1 = new Jeep(engine1);
car1.installEngine();
}
}
四,橋接模式的應用場景
- 當一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展時。
- 當一個系統不希望使用繼承或因爲多層次繼承導致系統類的個數急劇增加時。
- 當一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性時。
五,橋接模式的擴展
有時橋接(Bridge)模式可與適配器模式聯合使用。當橋接(Bridge)模式的實現化角色的接口與現有類的接口不一致時,可以在二者中間定義一個適配器將二者連接起來