橋接模式 屬於結構型模式。它將抽象部分與實現部分分離,使它們都可以獨立地變化。通過組合關係替代繼承關係,避免繼承層級爆炸。
問題:咖啡有「中杯/大杯」兩種尺寸,「加奶/不加奶」兩種風味。若用繼承需 4 個子類(中杯加奶、中杯不加奶、大杯加奶、大杯不加奶),維度增加會爆炸。橋接模式將「尺寸」作為抽象,「風味」作為實現。
// 1. 實現化接口:風味
public interface CoffeeImp {
void pourCoffeeImp();
}
// 2. 具體實現:加奶、不加奶
public class MilkCoffeeImp implements CoffeeImp {
@Override public void pourCoffeeImp() { System.out.print(" + 加奶"); }
}
public class FragrantCoffeeImp implements CoffeeImp {
@Override public void pourCoffeeImp() { System.out.print(" + 原味"); }
}
// 3. 抽象化:咖啡基類
public abstract class Coffee {
protected CoffeeImp imp; // 橋接引用
public void setImp(CoffeeImp imp) { this.imp = imp; }
public abstract void pourCoffee();
}
// 4. 修正抽象化:中杯、大杯
public class MediumCoffee extends Coffee {
@Override public void pourCoffee() {
System.out.print("中杯咖啡");
for (int i = 0; i < 2; i++) imp.pourCoffeeImp(); // 模擬沖泡次數
System.out.println();
}
}
public class SuperSizeCoffee extends Coffee {
@Override public void pourCoffee() {
System.out.print("大杯咖啡");
for (int i = 0; i < 5; i++) imp.pourCoffeeImp();
System.out.println();
}
}
// 5. 客戶端:靜態組合
public class Client {
public static void main(String[] args) {
Coffee coffee = new MediumCoffee();
coffee.setImp(new MilkCoffeeImp()); // 中杯加奶
coffee.pourCoffee();
coffee = new SuperSizeCoffee();
coffee.setImp(new FragrantCoffeeImp()); // 大杯原味
coffee.pourCoffee();
}
}