橋接模式--Bridge
摘要
本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的UML,詳解介紹了橋接模式的原理及應用。本文可幫助讀者快速掌握橋接模式,以便工作學習中使用橋接模式。
一、橋接模式
在我們的生活中,一個物體所擁有的功能常常是多樣的,比如廚師Tom會做紅燒魚,會做獅子頭,而他兩年之後又會做小龍蝦,所以廚師Tom的烹飪功能在不斷的變化。
程序如同生活,一個對象擁有的方法也是不斷變化的,現要實現廚師Tom類的cooking()方法,需要實現紅燒魚方法、獅子頭方法,兩年之後還要重構廚師Tom類,增加小龍蝦方法。由此可見違背了“開閉原則”。同時,若需要一個廚師Damon,他也會做紅燒魚、獅子頭、小龍蝦,那麼又得拷貝一份代碼,這樣我們的代碼重用性很低。
橋接模式爲上面的問題提供了一種解決方式。橋接模式將抽象行爲和具體實行進行分離,需要時進行組裝即可。對於如上問題,將廚師Tom會的具體烹飪方法分離出來單獨成立一個紅燒魚類、獅子頭類、小龍蝦類。由此可見廚師Tom的烹飪方法增加,不會再去更改源代碼,而是新擴展一個功能類,這樣就達到了“開閉原則”。
二、橋接模式的實現
2.1 場景設計
現有KFC和麥當勞兩家餐飲店,兩家餐飲店都會做漢堡、薯條,漢堡又分爲牛肉漢堡、雞肉漢堡,薯條分爲番茄薯條、辣薯條。
借鑑橋接模式的思想,將牛肉漢堡、雞肉漢堡、番茄薯條、辣薯條都單獨封裝成類。若麥當勞製作牛肉漢堡時,只需要將牛肉漢堡類傳給麥當勞類,並調用麥當勞類的通用方法cookingHamburger()即可,其他烹飪操作類似。
2.2 代碼實現
2.2.1 Store 商店抽象類
package ft.patterns.bridge;
public abstract class Store {
private Chips chips;
private Humburger humburger;
public Store(Chips chips, Humburger humburger) {
this.chips = chips;
this.humburger = humburger;
}
public Chips getChips() {
return chips;
}
public void setChips(Chips chips) {
this.chips = chips;
}
public Humburger getHumburger() {
return humburger;
}
public void setHumburger(Humburger humburger) {
this.humburger = humburger;
}
public void humburgerCooking() {
humburger.humburgerCooking();
}
public void chipsCooking() {
chips.chipsCooking();
}
}
2.2.2 KFC 商店具體類KFC
package ft.patterns.bridge;
public class KFC extends Store{
public KFC(Humburger humburger, Chips chips) {
super(chips, humburger);
}
@Override
public void humburgerCooking() {
super.humburgerCooking();
}
@Override
public void chipsCooking() {
super.chipsCooking();
}
}
2.2.3 MCD 商店具體類MCD
package ft.patterns.bridge;
public class MCD extends Store{
public MCD(Chips chips, Humburger humburger) {
super(chips, humburger);
}
public void humburgerCooking() {
super.humburgerCooking();
}
public void chipsCooking() {
super.chipsCooking();
}
}
2.2.4 Chips 薯條抽象類
package ft.patterns.bridge;
public interface Chips {
void chipsCooking();
}
2.2.5 ChipsHot 薯條具體類
package ft.patterns.bridge;
public class ChipsHot implements Chips{
@Override
public void chipsCooking() {
System.out.println("I am hot chips.");
}
}
2.2.6 ChipsKetchup 薯條具體類
package ft.patterns.bridge;
public class ChipsKetchup implements Chips{
@Override
public void chipsCooking() {
System.out.println("I am ketchup chips.");
}
}
2.2.7 Hamburger 漢堡抽象類
package ft.patterns.bridge;
public interface Humburger {
void humburgerCooking();
}
2.2.8 HamburgerBeef 漢堡具體類
package ft.patterns.bridge;
public class HumburgerBeef implements Humburger{
@Override
public void humburgerCooking() {
System.out.println("I am beef humburger.");
}
}
2.2.9 HamburgerChicken 漢堡具體類
package ft.patterns.bridge;
public class HumburgerChicken implements Humburger{
@Override
public void humburgerCooking() {
System.out.println("I am chicken humburger.");
}
}
2.2.10 Main測試類
package ft.patterns.bridge;
public class Bridge {
public static void main(String[] args) {
Chips kfcChips = new ChipsHot();
Humburger kfcHumburger = new HumburgerBeef();
Store kfcStore = new KFC(kfcHumburger,kfcChips);
Chips mcdChips = new ChipsKetchup();
Humburger mcdHumburger = new HumburgerChicken();
Store mcdStore = new KFC(mcdHumburger,mcdChips);
kfcStore.chipsCooking();
kfcStore.humburgerCooking();
mcdStore.chipsCooking();
mcdStore.humburgerCooking();
}
}
2.2.11 測試結果
I am hot chips.
I am beef humburger.
I am ketchup chips.
I am chicken humburger.