字節(jié)跳動飛書內(nèi)推套么!
北京、杭州碳蛋、武漢胚泌、廣州、深圳肃弟、上海玷室,六大城市等你來投零蓉。
感興趣的朋友可以私我咨詢&內(nèi)推,也可以通過鏈接直接投遞阵苇!
海量HC壁公,極速響應(yīng),快來和我成為同事吧绅项。
今日頭條紊册、抖音、Tik Tok也可以內(nèi)推~
點擊進入我的博客
門面模式(Facade Pattern)要求一個子系統(tǒng)的外部與其內(nèi)部通信快耿,必須通過一個統(tǒng)一的門面對象進行囊陡。
3.7.1 門面模式結(jié)構(gòu)
門面模式?jīng)]有一個一般化的類圖描述,可以用下面的例子來說明掀亥。
門面模式
- 門面(Facade)角色:外部可以調(diào)用這個角色的方法撞反。此角色知道子系統(tǒng)的功能和責任。
- 子系統(tǒng)(Subsystem)角色:可以有多個子系統(tǒng)搪花,子系統(tǒng)不需要知道門面的存在遏片。
3.7.2 細節(jié)
門面數(shù)量
通常只需要一個門面類,而且只有一個實例撮竿,因此可以設(shè)計稱單例模式吮便。當然也可有多個類。
使用場景
- 為一個復雜的子系統(tǒng)提供一個簡單的接口
- 使子系統(tǒng)和外部分離開來
- 構(gòu)建一個層次化系統(tǒng)時幢踏,可以使使用Facade模式定義系統(tǒng)中每一層髓需,實現(xiàn)分層。
優(yōu)點
- 減少系統(tǒng)之間的相互依賴房蝉。
- 提高了安全性僚匆。
缺點
- 不符合開閉原則
- 如果要改東西很麻煩,繼承重寫都不合適搭幻。
Java例子
MVC三層結(jié)構(gòu)
3.7.3 KFC例子
假如沒有服務(wù)員(門面)咧擂,顧客(外部系統(tǒng))要點一個套餐需要知道每個套餐包含的食物(子系統(tǒng))種類,這樣就會非常麻煩檀蹋,所以最好的方式是直接告訴服務(wù)員套餐名稱就好了松申。
public class Customer {
public static void main(String[] args) {
Waiter waiter = new Waiter();
List<Food> foodList = waiter.orderCombo("Combo1");
}
}
abstract class Food {}
class MiniBurger extends Food {}
class MexicanTwister extends Food {}
class CornSalad extends Food {}
class HotWing extends Food {}
class PepsiCola extends Food {}
class Waiter {
public List<Food> orderCombo(String comboName) {
List<Food> foodList;
switch (comboName) {
case "Combo1" :
foodList = Arrays.asList(new MiniBurger(), new CornSalad(), new PepsiCola());
break;
case "Combo2":
foodList = Arrays.asList(new MexicanTwister(), new HotWing(), new PepsiCola());
break;
default:
foodList = new ArrayList<>();
}
return foodList;
}
}