設計模式之外觀模式(卷十)
阿新 • • 發佈:2019-01-28
外觀模式通過引入一個外觀類來簡化客戶端和各個子系統之間的互動,為多個複雜的子系統提供一個統一的訪問入口,降低客戶端與子系統之間的耦合度。
0x00 組織結構
- Facade:外觀類,負責與客戶端互動,將客戶端委託的請求轉交給對應的子系統處理。
- SubSystem:子系統,負責處理客戶端的請求,可能存在多個子系統,通常子系統是多個類的集合。子系統可以直接和客戶端互動,也可以和外觀類互動,在它看來,二者都是客戶端。
0x01 示例程式碼
在現實生活中,以去餐館吃飯為例,其中服務員對應外觀類,廚房和前臺為兩個子系統。程式碼如下。
package com.kkk.pattern.facade;
/**
* 充當外觀類
* Created by z3jjlzt on 2018/1/10.
*/
public class Waiter {
private Kitchen kitchen = Kitchen.getInstance();
private Checkstand checkstand = Checkstand.getInstance();
public void order(String food) {
kitchen.cook(food);
}
public void pay(int money) {
checkstand.cashier(money);
}
}
import java.util.Random;
/**
* 一個子系統
* Created by z3jjlzt on 2018/1/10.
*/
public class Checkstand {
private Checkstand(){}
private static class Instance{
private static final Checkstand c = new Checkstand();
}
public static Checkstand getInstance() {
return Instance.c;
}
public void cashier(int money) {
System.out.println("顧客支付 " + money + "元");
int t = new Random().nextInt(100);
System.out.println("應收" + t + "元");
System.out.println("找零 " + (money - t) + "元");
}
}
結果:
接到顧客點餐
正在製作美食 排骨湯
製作完成
接到顧客點餐
正在製作美食 紅燒魚
製作完成
顧客支付 100元
應收 21元
找零 79元
0xff 總結
- 優點:實現了客戶端和子系統直接的鬆耦合。
- 缺點:客戶端也可以直接和子系統互動;外觀類承擔過多職責,違背了單一職責的原則。
- 適用場景:為一系列複雜的子系統提供一個統一訪問入口。