2018/11/29《大話設計模式》【外觀模式】
《陳樂一 青鳥》 繼續~
小李一直在一個三線小城市從事軟體開發,於是有一天,他覺得應該去大城市打拼了......
在經過了面試之後,被一家X城XX公司錄取了,並要求在XX日帶齊資料入職......
於是, 小李就開始準備自己的資料(服務端) 給 公司提供了(客戶端)~
一:準備資料
1:首先定義一個準備資料的通用介面:
// 通用介面 interface Entry { public function exec(); }
2:接著影印身份證/學歷等等......
class IdCard implements Entry {public function exec() { echo '影印身份證'; } }
3:然後再去體檢
class Examination implements Entry { public function exec() { echo '我去入職體檢'; } }
4:還需要離職證明呢
class LeaveProve implements Entry { public function exec() { echo '準備離職證明'; } }
二:資料準備完了,提交資料(客戶端獲取結果)
echo '開始提交資料';
$IdCard = new IdCard();
$IdCard->exec();
$Examination = new Examination();
$Examination->exec();
$LeaveProve = new LeaveProve();
$LeaveProve->exec();
echo '提交資料結束';
三:分析
- 我們發現,客戶端(公司),更關心的是你準備的結果,而不是你準備的過程。
- 換成系統來看的話,客戶端(公司)和多個子系統(準備過程)互動
- 外觀模式定義:
- 外觀模式定義了一個高層的功能,為子系統中的多個模組協同的完成某種功能需求提供簡單的對外功能呼叫方式,使得這一子系統更加容易被外部使用。
- 簡單來說,就是對外定義公共的訪問介面,同時隱藏內部邏輯,這樣即使子系統產生了邏輯修改,也可以非常方便安全的去維護。
四:重構
1:有了上面的思想,那麼我們就為這個地方封裝一個 門面/外觀
public class AllExec() { public function exec { echo '開始辦理手續...'; $IdCard = new IdCard(); $IdCard->exec(); $Examination = new Examination(); $Examination->exec(); $LeaveProve = new LeaveProve(); $LeaveProve->exec(); echo '手續終於辦完了'; } }
2:當公司(客戶端)找我們要資料時
$AllExec = new AllExec(); $AllExec->exec();
五:總結
- 外觀模式的目的不是給予子系統新增新的功能介面,而是為了讓外部減少與子系統內多個模組的互動,鬆散耦合,從而讓外部能夠更簡單地使用子系統。
六:Github地址