外觀模式
摘要
本文通過簡潔的模式描述,應用場景的詳細代碼實現,以及匹配的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.