java 中的橋模式實現
橋接模式將抽象與實現分離,以便兩者可以獨立變化。它是通過組合而不是繼承來實現的。
來自維基百科的橋 UML 圖:
這種模式中有四個元件。
Abstraction
:它定義了一個介面
RefinedAbstraction
:它實現了抽象:
Implementor
:它定義了一個實現介面
ConcreteImplementor
:它實現了 Implementor 介面。
The crux of Bridge pattern :
使用組合(沒有繼承)的兩個正交類層次結構。抽象層次結構和實現層次結構可以獨立變化。實現從未引用抽象。抽象包含實現介面作為成員(通過組合)。此組合減少了一個級別的繼承層次結構。
真實用例:
使不同的車輛具有手動和自動齒輪系統的兩種版本。
示例程式碼:
/* Implementor interface*/
interface Gear{
void handleGear();
}
/* Concrete Implementor - 1 */
class ManualGear implements Gear{
public void handleGear(){
System.out.println("Manual gear");
}
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
public void handleGear(){
System.out.println("Auto gear");
}
}
/* Abstraction (abstract class) */
abstract class Vehicle {
Gear gear;
public Vehicle(Gear gear){
this.gear = gear;
}
abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
public Car(Gear gear){
super(gear);
// initialize various other Car components to make the car
}
public void addGear(){
System.out.print("Car handles ");
gear.handleGear();
}
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
public Truck(Gear gear){
super(gear);
// initialize various other Truck components to make the car
}
public void addGear(){
System.out.print("Truck handles " );
gear.handleGear();
}
}
/* Client program */
public class BridgeDemo {
public static void main(String args[]){
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
gear = new ManualGear();
vehicle = new Truck(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Truck(gear);
vehicle.addGear();
}
}
輸出:
Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear
說明:
Vehicle
是一個抽象。Car
和Truck
是Vehicle
的兩個具體實現。Vehicle
定義了一個抽象方法:addGear()
。Gear
是實現者介面ManualGear
和AutoGear
是Gear
的兩個實現Vehicle
包含implementor
介面而不是實現介面。實現者介面的Compositon
是這種模式的關鍵: 它允許抽象和實現獨立變化。Car
和Truck
為抽象定義實現(重新定義的抽象):addGear()
:它包含Gear
-Manual
或Auto
Bridge 模式的用例 :
- 抽象和實現可以彼此獨立地更改,並且它們在編譯時不受約束
- 對映正交層次結構 - 一個用於抽象,一個用於實現。