[toc]
## 舉個例子
> 新生入學, 不知所措? 學長迎新, 一條龍服務
> 不熟悉學校? 找到學長, 照樣把事兒辦了
> 也可以理解成對接
## 代碼示例
```php
<?php
// 入學報到
class Register {
public function phpRegister($name) {
echo "活動中心:" . $name . "同學報到成功!" . PHP_EOL;
}
}
// 繳費
class Payment {
public function pay($name, $money) {
echo "繳費中心:" . "收到" . $name . "同學" . strval($money) . "元付款,繳費成功!" . PHP_EOL;
}
}
// 宿舍管理中心(生活中心)
class DormitoryManagementCenter {
public function provideLivingGoods($name) {
echo "生活中心:" . $name . "同學的生活用品已發放。" . PHP_EOL;
}
}
// 宿舍
class Dormitory {
public function meetRoommate($name) {
echo "宿 舍:" . "大家好!這是剛來的" . $name . "同學,是你們未來需要共度四年的室友!相互認識一下……" . PHP_EOL;
}
}
// 迎新志愿者
class Volunteer {
protected $name;
protected $register;
protected $payment;
protected $lifeCenter;
protected $dormintory;
public function __construct($name) {
$this->name = $name;
$this->register = new Register();
$this->payment = new Payment();
$this->lifeCenter = new DormitoryManagementCenter();
$this->dormintory = new Dormitory();
}
public function welcomeFreshmen($name) {
echo "你好," . $name . "同學! 我是新生報到的志愿者" . $this->name . ",我將帶你完成整個報到流程。" . PHP_EOL;
$this->register->phpRegister($name);
$this->payment->pay($name, 10000);
$this->lifeCenter->provideLivingGoods($name);
$this->dormintory->meetRoommate($name);
}
}
// 測試
$volunteer = new Volunteer("Frank");
$volunteer->welcomeFreshmen("Tony");
```
```
D:\soft\php72\php.exe D:\project\php_dp\index.php
你好,Tony同學! 我是新生報到的志愿者Frank,我將帶你完成整個報到流程。
活動中心:Tony同學報到成功!
繳費中心:收到Tony同學10000元付款,繳費成功!
生活中心:Tony同學的生活用品已發放。
宿 舍:大家好!這是剛來的Tony同學,是你們未來需要共度四年的室友!相互認識一下……
Process finished with exit code 0
```
## 代碼說明
1. 迎新志愿者陪同并幫助入學新生完成報到登記、繳納學費、領日用品、入住宿舍等一系列的報到流程。
2. 新生不用知道具體的報到流程,不用去尋找各個場地;只要跟著志愿者走,到指定的地點,根據志愿者的指導,完成指定的任務即可。
3. 志愿者雖然不是直接提供這些報到服務,但也相當于間接提供了報到登記、繳納學費、領日用品、入住宿舍等一條龍的服務,幫新生減輕了不少麻煩和負擔。
4. 在這里志愿者就相當于一個對接人,將復雜的業務通過一個對接人來提供一整套統一的(一條龍式的)服務,讓用戶不用關心內部復雜的運行機制。
## 什么是外觀模式?
> 為子系統中的一組接口提供一個一致的界面稱為外觀模式
> 外觀模式定義了一個高層接口,這個接口使得這一子系統更容易使用。
> 外觀模式的核心思想:用一個簡單的接口來封裝一個復雜的系統,使這個系統更容易使用。

## 設計要點
1. **外觀角色(Facade)**: 為子系統封裝統一的對外接口,如同子系統的一個門面。這個類一般不負責具體的業務邏輯,只是一個委托類,具體的業務邏輯由子系統完成。
1. **子系統(SubSystem)**: 由多個類組成的具有某一特定功能的子系統。可以是第三方庫,也可以是自己的基礎庫,還可能是一個子服務,為整個系統提供特定的功能或服務。
## 優缺點
**優點**:
1. 實現了子系統與客戶端之間的松耦合關系,這使得子系統的變化不會影響到調用它的客戶端。
1. 簡化了客戶端對子系統的使用難度,客戶端(用戶)無須關心子系統的具體實現方式,而只需要和外觀進行交互即可。
1. 為不同的用戶提供了統一的調用接口,方便了系統的管理和維護。
**缺點**:
1. 因為統一了調用的接口,降低了系統功能的靈活性。
## 應用場景
1. 當要為一個復雜子系統提供一個簡單接口時;
1. 客戶程序與多個子系統之間存在很大的依賴性,引入外觀類將子系統與客戶以及其他子系統解耦,可以提高子系統的獨立性和可移植性;
1. 在層次化結構中,可以使用外觀模式定義系統中每一層的入口,層與層之間不直接產生聯系,而通過外觀類建立聯系,降低層之間的耦合度。