外觀模式

摘要

  本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的UML,詳解介紹了外觀模式的原理及應用。本文可幫助讀者快速掌握外觀模式,以便工作學習中使用外觀模式。

一、外觀模式

  在一家燒烤店中,有羊肉串、牛肉串、茄子,現來了三位顧客張三、李四、王五,他們的點餐各不相同,張三要5串羊肉串、10串牛肉串;李四要10串羊肉串、15串牛肉串、1個茄子;王五要5串羊肉串、2個茄子。將燒烤店的商品看成一個集合,把客戶看成第二集合,由此可見兩個集合之間的關係比較複雜和多變。
  在編程時,也會出現兩個集合對象之間關係無規則且多變的情況。若在任一集合中添加一個對象,都會讓兩個集合之間的關係更爲複雜,這樣的代碼不利於我們後期的維護和擴展。
  外觀模式則是爲這一問題提出瞭解決方案。在燒烤店中,我們加入一個服務員,讓所有顧客向服務員點餐,同時食物也直接給服務員,這樣關係網絡不在是網狀,而是“多 <——> 1 <——> 多”的關係,實現了食物與顧客之間的解耦。在兩個集合對象中,可以在中間加入一個“服務”對象即可,讓兩個集合都通過服務對象與另一個集合發生關係,這樣就會改善網狀關係。

二、外觀模式的實現

2.1 場景設計

   KFC中有薯條、炸雞、漢堡、可樂、果汁,顧客可以通過前臺服務員進行點餐。

2.2 代碼實現

2.2.1 Facade 服務員角色

package ft.patterns.facade;

public class Facade {
	private Chips chips;
	private Hamburger hamburger;
	private FriedChicken friedChicken;
	private FruitJuice fruitJuice;
	private Cola cola;
	
	public Facade(Chips chips, Hamburger hamburger, FriedChicken friedChicken, FruitJuice fruitJuice, Cola cola) {
		this.chips = chips;
		this.hamburger = hamburger;
		this.friedChicken = friedChicken;
		this.fruitJuice = fruitJuice;
		this.cola = cola;
	}
	
	public void packageA() {
		chips.cookingChips();
		friedChicken.cookingFriedChicken();
		System.out.println("PackageA is complete.");
	}
	
	public void packageB() {
		chips.cookingChips();
		friedChicken.cookingFriedChicken();
		cola.cookingCola();
		System.out.println("PackageB is complete.");
	}
	
	public void packageC() {
		hamburger.cookingHamburger();
		friedChicken.cookingFriedChicken();
		fruitJuice.cookingFruitJuice();
		System.out.println("PackageC is complete.");
	}
}

2.2.2 Chips 薯條

package ft.patterns.facade;

public class Chips {
	public void cookingChips() {
		System.out.println("It is cooking Chips.");
	}
}

2.2.3 FriedChicken 炸雞

package ft.patterns.facade;

public class FriedChicken {
	public void cookingFriedChicken() {
		System.out.println("It is cooking FriedChicken.");
	}
}

2.2.4 Hamburger 漢堡

package ft.patterns.facade;

public class Hamburger {
	public void cookingHamburger() {
		System.out.println("It is cooking Hamburger.");
	}
}

2.2.5 Cola 可樂

package ft.patterns.facade;

public class Cola {
	public void cookingCola() {
		System.out.println("It is cooking Cola.");
	}
}

2.2.6 FruitJuice 果汁

package ft.patterns.facade;

public class FruitJuice {
	public void cookingFruitJuice() {
		System.out.println("It is cooking FruitJuice.");
	}
}

2.2.7 Main 測試類

package ft.patterns.facade;

public class Main {
	public static void main(String[] args) {
		Chips chips = new Chips();
		Hamburger hamburger = new Hamburger();
		FriedChicken friedChicken = new FriedChicken();
		FruitJuice fruitJuice = new FruitJuice();
		Cola cola = new Cola();
		
		Facade kfcFacade = new Facade(chips, hamburger, friedChicken, fruitJuice, cola);
		kfcFacade.packageA();
		System.out.println();
		kfcFacade.packageB();
		System.out.println();
		kfcFacade.packageC();
	}
}

2.2.8 測試結果

It is cooking Hamburger.
It is cooking FriedChicken.
It is cooking FruitJuice.
PackageC is complete.

三、外觀模式的UML圖

外觀模式UML類圖

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