介紹
橋接模式屬于結(jié)構(gòu)型模式论巍,用于把抽象化與實現(xiàn)化解耦阔挠,使得二者可以獨立變化医舆,它通過提供抽象化和實現(xiàn)化之間的橋接結(jié)構(gòu),來實現(xiàn)二者的解耦振坚。橋接模式適用于一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性即硼,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,以及不希望使用繼承或因為多層次繼承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng)屡拨,或者一個類存在兩個獨立變化的維度只酥,且這兩個維度都需要進(jìn)行擴展。
就例如各個小吃店的點餐系統(tǒng)呀狼,商品名稱會和微辣裂允、中辣、特辣區(qū)分開哥艇。小吃店的菜單可以看下圖
這里寫圖片描述
通常這種都會放在另外一塊绝编,而不是放在每個食物的前面。如果放在食物的前面貌踏,那么這個菜單的擴大3倍十饥,
如果商家又推出變態(tài)辣,那么整個菜單就需要重新做祖乳。
這里寫圖片描述
結(jié)構(gòu)圖
圖片來源于網(wǎng)絡(luò)
案例
這篇就用小吃店的點餐系統(tǒng)來舉例逗堵。
食物抽象類
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();
}
}
調(diào)料實現(xiàn)類接口
public interface Seasoning {
void addSeasoning();
}
芥末調(diào)料
public class Mustard implements Seasoning {
@Override
public void addSeasoning() {
System.out.println("加芥末");
}
}
香菜調(diào)料
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();
}
}
測試結(jié)果1
如果要增加調(diào)料或者增加食物,只要繼承相應(yīng)的類或者接口就可以了眷昆。
Github地址
總結(jié)
--
橋接模式將抽象部分與它的實現(xiàn)部分分離蜒秤,使它們都可以獨立地變化。它是一種對象結(jié)構(gòu)型模式亚斋,又稱為柄體(Handle and Body)模式或接口(Interface)模式作媚。
使用橋接模式可以分離抽象接口及其實現(xiàn)部分,提高了系統(tǒng)的可擴充性實現(xiàn)細(xì)節(jié)對客戶透明帅刊,可以對用戶隱藏實現(xiàn)細(xì)節(jié)纸泡;其主要缺點是增加系統(tǒng)的理解與設(shè)計難度,且識別出系統(tǒng)中兩個獨立變化的維度并不是一件容易的事情赖瞒。