橋接模式--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.

三、橋接模式的UML圖

橋接模式UML類圖

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 1826
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章