DesignPattern - Structural - Bridge
Tue, Aug 7, 2018
閱讀時間 2 分鐘
Bridge
在接口和實現中都有接口層次結構時,使用 Bridge 設計模式將接口與實現分離,並對客戶端程序隱藏實現細節。
根據 GoF 橋的設計模式是:將抽象與其實現分離,以便兩者可以獨立變化
。
將抽象及其實現分開,並為抽象和實現者開發單獨的繼承結構。抽像是接口或抽像類,同樣實現者是接口或抽像類。抽象包含對實現者的引用。抽象的孩子被稱為精煉抽象,實現者的孩子是具體的實現者。由於我們可以在抽像中更改對實現者的引用,因此我們可以在運行時更改抽象的實現者。但是,對實現者的更改不會影響客戶端代碼。
Bridge 的目的是將抽象和實現放入兩個不同的類層次結構中,以便兩者都可以獨立擴展。 Bridge 幫助兩個不兼容的 類一起工作。但是 Bridge 通過創建兩個不同的層次結構來分離抽象和實現。
/**
* abstraction in Bridge pattern
* */
public abstract class Vehicle {
protected VehicleType type1;
protected VehicleType type2;
public Vehicle(VehicleType type1, VehicleType type2) {
this.type1 = type1;
this.type2 = type2;
}
abstract public void purchase();
}
/**
* Implementor for Bridge pattern
* */
public interface VehicleType {
abstract public void book();
}
/**
* Refine abstraction 1 in Bridge pattern
*/
public class Car extends Vehicle {
public Car(VehicleType type1, VehicleType type2) {
super(type1, type2);
}
@Override
public void purchase() {
System.out.print("Car");
type1.book();
type2.book();
}
}
/**
* Refine abstraction 2 in Bridge pattern
*/
public class Bike extends Vehicle {
public Bike(VehicleType type1, VehicleType type2) {
super(type1, type2);
}
@Override
public void purchase() {
System.out.print("Bike");
type1.book();
type2.book();
}
}
/**
* Concrete implementation 1 for Bridge pattern
* */
public class NewVehicle implements VehicleType {
@Override
public void book() {
System.out.print(" : New Vehicle");
}
}
/**
* Concrete implementation 2 for Bridge pattern
* */
public class OldVehicle implements VehicleType {
@Override
public void book() {
System.out.println(" : Old Vehicle");
}
}
public static void main(String[] args) {
Vehicle vehicle1= new Car(new NewVehicle(),new OldVehicle());
vehicle1.purchase();
Bike vehicle2 = new Bike(new NewVehicle(),new OldVehicle());
vehicle2.purchase();
}
- 多個實現時最好使用。
- 需要在運行時切換實現時應該使用。
- 如果抽象的實現有修改,客戶端不應該受到影響。
- 創建兩個不同的層次結構。一個用於抽象,另一個用於實現。
- 通過消除抽象和實現之間的依賴關係來避免永久綁定, 創建了一個在抽象和實現之間協調的橋樑。
- 抽象和實現可以分開擴展。