介紹
橋接模式屬于結構型模式,用于把抽象化與實現化解耦,使得二者可以獨立變化,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。橋接模式適用于一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,以及不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,或者一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
就例如各個小吃店的點餐系統,商品名稱會和微辣、中辣、特辣區分開。小吃店的菜單可以看下圖
這里寫圖片描述
通常這種都會放在另外一塊,而不是放在每個食物的前面。如果放在食物的前面,那么這個菜單的擴大3倍,
如果商家又推出變態辣,那么整個菜單就需要重新做。
這里寫圖片描述
結構圖
圖片來源于網絡
案例
這篇就用小吃店的點餐系統來舉例。
食物抽象類
public abstract class Food {
protected Seasoning seasoning;
public void setSeasoning(Seasoning seasoning) {
this.seasoning = seasoning;
}
public abstract void addSeasoning();
}
食物繼承類-茄子
public class Eggplant extends Food {
@Override
public void addSeasoning() {
System.out.print("茄子");
seasoning.addSeasoning();
}
}
食物繼承類-魚
public class Fish extends Food {
@Override
public void addSeasoning() {
System.out.print("魚");
seasoning.addSeasoning();
}
}
調料實現類接口
public interface Seasoning {
void addSeasoning();
}
芥末調料
public class Mustard implements Seasoning {
@Override
public void addSeasoning() {
System.out.println("加芥末");
}
}
香菜調料
public class Coriander implements Seasoning {
@Override
public void addSeasoning() {
System.out.println("加香菜");
}
}
測試類
public class Client {
public static void main(String[] args) {
Food fish = new Fish();
fish.setSeasoning(new Coriander());
fish.addSeasoning();
Food eggplant = new Eggplant();
eggplant.setSeasoning(new Mustard());
eggplant.addSeasoning();
}
}
測試結果1
如果要增加調料或者增加食物,只要繼承相應的類或者接口就可以了。
Github地址
總結
--
橋接模式將抽象部分與它的實現部分分離,使它們都可以獨立地變化。它是一種對象結構型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式。
使用橋接模式可以分離抽象接口及其實現部分,提高了系統的可擴充性實現細節對客戶透明,可以對用戶隱藏實現細節;其主要缺點是增加系統的理解與設計難度,且識別出系統中兩個獨立變化的維度并不是一件容易的事情。