外觀模式 (Facade Pattern): 為子系統(tǒng)中的一組接口提供一個一致的界面棚菊,定義一個高層接口民轴,這個接口使得這一子系統(tǒng)更加容易使用。
(一)為什么需要外觀模式
1幕侠,開發(fā)階段,子系統(tǒng)越來越復(fù)雜,增加外觀模式提供一個簡單的調(diào)用接口凶杖。
2,維護一個大型遺留系統(tǒng)的時候杈湾,可能這個系統(tǒng)已經(jīng)非常難以維護和擴展,但又包含非常重要的功能,為其開發(fā)一個外觀類抹恳,以便新系統(tǒng)與其交互健霹。
3宣吱,外觀模式可以隱藏來自調(diào)用對象的復(fù)雜性杭攻。
(二)外觀模式UML圖
(三)簡單實例
比如說我們?nèi)メt(yī)院就診锅睛,醫(yī)院有醫(yī)生員工系統(tǒng)历谍,有藥品系統(tǒng)现拒,有患者資料系統(tǒng)。但是我們只是在前臺掛個號望侈,就能在其他系統(tǒng)里都看到我們印蔬。外觀系統(tǒng)就差不多這樣扛点。
如果沒有掛號系統(tǒng)的話,我們就先要去醫(yī)生系統(tǒng)通知一下醫(yī)生奥帘,
然后去患者系統(tǒng)取一下患者資料交給醫(yī)生已旧,再去藥品系統(tǒng)登記一下,最后到藥房領(lǐng)藥檀咙。
<?php
//醫(yī)院醫(yī)生員工系統(tǒng)
class DoctorSystem{
//通知就診醫(yī)生
static public function getDoctor($name){
echo __CLASS__.":".$name."醫(yī)生,掛你號".PHP_EOL;
return new Doctor($name);
}
}
//醫(yī)生類
class Doctor{
public $name;
public function __construct($name){
$this->name = $name;
}
public function prescribe($data){
echo __CLASS__.":"."開個處方給你".PHP_EOL;
return "祖?zhèn)髅胤搅Ь鳎幍奖厮?;
}
}
//患者系統(tǒng)
class SufferSystem {
static function getData($suffer){
$data = $suffer."資料";
echo __CLASS__.":".$suffer."的資料是這些".PHP_EOL ;
return $data;
}
}
//醫(yī)藥系統(tǒng)
class MedicineSystem {
static function register($prescribe){
echo __CLASS__.":"."拿到處方:".$prescribe."------------通知藥房發(fā)藥了".PHP_EOL;
Shop::setMedicine("砒霜5千克");
}
}
//藥房
class shop{
static public $medicine;
static function setMedicine($medicine){
self::$medicine = $medicine;
}
static function getMedicine(){
echo __CLASS__.":".self::$medicine.PHP_EOL;
}
}
//如果沒有掛號系統(tǒng)棕诵,我們就診的第一步
//通知就診醫(yī)生
$doct = DoctorSystem::getDoctor("顧夕衣");
//患者系統(tǒng)拿病歷資料
$data = SufferSystem::getData("何在");
//醫(yī)生看病歷資料裁良,開處方
$prscirbe = $doct->prescribe($data);
//醫(yī)藥系統(tǒng)登記處方
MedicineSystem::register($prscirbe);
//藥房拿藥
Shop::getMedicine();
echo PHP_EOL.PHP_EOL."--------有了掛號系統(tǒng)以后--------".PHP_EOL.PHP_EOL;
//掛號系統(tǒng)
class Facade{
static public function regist($suffer,$doct){
$doct = DoctorSystem::getDoctor($doct);
//患者系統(tǒng)拿病歷資料
$data = SufferSystem::getData($suffer);
//醫(yī)生看病歷資料,開處方
$prscirbe = $doct->prescribe($data);
//醫(yī)藥系統(tǒng)登記處方
MedicineSystem::register($prscirbe);
//藥房拿藥
Shop::getMedicine();
}
}
//患者只需要掛一個號校套,其他的就讓掛號系統(tǒng)去做吧趴久。
Facade::regist("葉好龍","賈中一");
外觀模式,也叫門面模式搔确。它多用于在多個子系統(tǒng)之間彼棍,作為中間層。用戶通過Facade對象膳算,直接請求工作座硕,省去了用戶調(diào)用多個子系統(tǒng)的復(fù)雜動作。
外觀模式常舉的一個例子涕蜂,就是我們買了好多支股票华匾,但是時間有限。盯盤很復(fù)雜机隙,我們搞得一團糟蜘拉。所以,我們干脆買了股票基金有鹿。股票基金就好比于外觀模式的Facade對象旭旭,而子系統(tǒng)就是股票基金投的各支股票。