外觀模式
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,定義一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用,外觀模式又稱門面模式
使用外觀模式的原因:
1,開(kāi)發(fā)階段,子系統(tǒng)越來(lái)越復(fù)雜,增加外觀模式提供一個(gè)簡(jiǎn)單的調(diào)用接口。
2,維護(hù)一個(gè)大型遺留系統(tǒng)的時(shí)候,可能這個(gè)系統(tǒng)已經(jīng)非常難以維護(hù)和擴(kuò)展,但又包含非常重要的功能,為其開(kāi)發(fā)一個(gè)外觀類,以便新系統(tǒng)與其交互。
3,外觀模式可以隱藏來(lái)自調(diào)用對(duì)象的復(fù)雜性。
外觀模式的目的在于降低系統(tǒng)的復(fù)雜程度
目錄結(jié)構(gòu)
|facade #項(xiàng)目根目錄
|--Think #核心類庫(kù)
|----depot.php #倉(cāng)庫(kù)類
|----facade.php #外觀角色
|----Loder.php #自動(dòng)加載類
|----orders.php #訂單類
|----products.php #商品類
|----user.php #用戶系統(tǒng)
|--index.php #單一的入口文件
代碼實(shí)踐
商品類 Think/products.php
<?php
/**
* 商品類
*/
namespace Think;
class products{
//查詢購(gòu)買的商品
static function getProduct($product) {
//查看商品庫(kù)存等信息...
return '商品'.$product;
}
}
訂單類 Think/orders.php
<?php
/**
* 訂單類
*/
namespace Think;
class orders{
static $product;
//添加訂單產(chǎn)品
static function pushProduct($product){
self::$product = $product;
}
//添加用戶信息,生成訂單
static function createOrder($name){
return $name."購(gòu)買的".self::$product.PHP_EOL;
}
}
用戶系統(tǒng) Think/user.php
<?php
/**
* 用戶系統(tǒng)
*/
namespace Think;
class user{
//完善用戶資料
static function setDate($name){
$data = "用戶名為".$name;
return $data;
}
}
倉(cāng)庫(kù)類 Think/depot.php
<?php
/**
* 倉(cāng)庫(kù)類
*/
namespace Think;
class depot {
//發(fā)貨
static function send($order){
echo $order;
}
}
自動(dòng)加載類 Think/Loder.php
<?php
namespace Think;
class Loder{
static function autoload($class){
require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
}
}
沒(méi)有使用外觀模式 index.php入口文件
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
//查詢要買的商品
$product = \Think\products::getProduct('帽子');
//提交訂單
$orderTmp = \Think\orders::pushProduct($product);
//添加用戶信息
$user = \Think\user::setDate('wong');
//生成訂單
$order = \Think\orders::createOrder($user);
//倉(cāng)庫(kù)發(fā)貨
$depot = \Think\depot::send($order);
print_r($depot);
輸出
用戶名為wong購(gòu)買的商品帽子
使用外觀模式 外觀角色 Think/facade.php
<?php
/**
* 外觀角色
*/
namespace Think;
class facade{
static function shop($product,$name){
//查詢要買的商品
$product = products::getProduct($product);
//提交訂單
$orderTmp = orders::pushProduct($product);
//添加用戶信息
$user = user::setDate($name);
//生成訂單
$order = orders::createOrder($user);
//倉(cāng)庫(kù)發(fā)貨
$depot = depot::send($order);
return $depot;
}
}
入口文件 index.php
<?php
define('BASEDIR',__DIR__);
include BASEDIR . '/Think/Loder.php';
spl_autoload_register('\\Think\\Loder::autoload');
$depot = \Think\facade::shop("褲子","wong");
print_r($depot);
輸出
用戶名為wong購(gòu)買的商品褲子
應(yīng)用實(shí)例: 去醫(yī)院看病,可能要去掛號(hào)、門診、劃價(jià)、取藥,讓患者或患者家屬覺(jué)得很復(fù)雜,如果有提供接待人員,只讓接待人員來(lái)處理,就很方便。
優(yōu)點(diǎn): 1、減少系統(tǒng)相互依賴。 2、提高靈活性。 3、提高了安全性。
缺點(diǎn):不符合開(kāi)閉原則,如果要改東西很麻煩,繼承重寫都不合適。
使用場(chǎng)景: 1、為復(fù)雜的模塊或子系統(tǒng)提供外界訪問(wèn)的模塊。 2、子系統(tǒng)相對(duì)獨(dú)立。 3、預(yù)防低水平人員帶來(lái)的風(fēng)險(xiǎn)。