php設計模式之外觀模式

外觀模式

為子系統(tǒng)中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用,外觀模式又稱門面模式
使用外觀模式的原因:
1,開發(fā)階段,子系統(tǒng)越來越復雜,增加外觀模式提供一個簡單的調用接口。
2,維護一個大型遺留系統(tǒng)的時候,可能這個系統(tǒng)已經非常難以維護和擴展,但又包含非常重要的功能,為其開發(fā)一個外觀類,以便新系統(tǒng)與其交互。
3,外觀模式可以隱藏來自調用對象的復雜性。

外觀模式的目的在于降低系統(tǒng)的復雜程度

目錄結構

|facade  #項目根目錄
|--Think  #核心類庫
|----depot.php  #倉庫類
|----facade.php  #外觀角色
|----Loder.php  #自動加載類
|----orders.php  #訂單類
|----products.php  #商品類
|----user.php  #用戶系統(tǒng)
|--index.php #單一的入口文件

代碼實踐

商品類 Think/products.php

<?php
/**
 * 商品類
 */
namespace Think;

class products{
    //查詢購買的商品
    static function getProduct($product) {
        //查看商品庫存等信息...
        return '商品'.$product;
    }
}

訂單類 Think/orders.php

<?php
/**
 * 訂單類
 */
namespace Think;

class orders{
    static $product;
    //添加訂單產品
    static function pushProduct($product){
        self::$product = $product;
    }
    //添加用戶信息,生成訂單
    static function createOrder($name){
        return $name."購買的".self::$product.PHP_EOL;
    }
}

用戶系統(tǒng) Think/user.php

<?php
/**
 * 用戶系統(tǒng)
 */
namespace Think;

class user{
    //完善用戶資料
    static function setDate($name){
        $data = "用戶名為".$name;
        return $data;
    }
}

倉庫類 Think/depot.php

<?php
/**
 * 倉庫類
 */
namespace Think;

class depot {
    //發(fā)貨
    static function send($order){
        echo $order;
    }
}

自動加載類 Think/Loder.php

<?php
namespace Think;

class Loder{
    static function autoload($class){
        require BASEDIR . '/' .str_replace('\\','/',$class) . '.php';
    }
}

沒有使用外觀模式 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);
//倉庫發(fā)貨
$depot = \Think\depot::send($order);
print_r($depot);

輸出

用戶名為wong購買的商品帽子

使用外觀模式 外觀角色 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);
        //倉庫發(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購買的商品褲子

應用實例: 去醫(yī)院看病,可能要去掛號、門診、劃價、取藥,讓患者或患者家屬覺得很復雜,如果有提供接待人員,只讓接待人員來處理,就很方便。

優(yōu)點: 1、減少系統(tǒng)相互依賴。 2、提高靈活性。 3、提高了安全性。

缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。

使用場景: 1、為復雜的模塊或子系統(tǒng)提供外界訪問的模塊。 2、子系統(tǒng)相對獨立。 3、預防低水平人員帶來的風險。

上一篇 php設計模式之代理模式
下一篇 php設計模式之橋接模式

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 關于Mongodb的全面總結 MongoDB的內部構造《MongoDB The Definitive Guide》...
    中v中閱讀 32,279評論 2 89
  • 工作 助理 21周工作內容(0523-0529) 0523 周一(中午抵達昆明,準備周四會議事宜) 報銷的發(fā)票已經...
    喜歡艾薇兒和小甜甜閱讀 328評論 0 0
  • 這世界很大,我們很小,微乎其微。在旅途中,小小的我們遇到了同樣小小的他們,我們與他們之間有相同也有不同,志趣相...
    溟濛夜雨閱讀 404評論 0 0
  • 女孩子護膚品瓶瓶罐罐那個多,水,精華液,美容液,霜,膏,隔離,防曬......,再不愛打扮的女子,各種面膜也都是標...
    60分媽媽Qing閱讀 210評論 1 0
  • 第五章終得一見 8、唐僧看瓷瓶兒與逐鹿君走遠,心里好不是滋味,但難以言表,便欲與上官雪e等作別,沒等上官雪e開口,...
    本無痕閱讀 383評論 27 26

友情鏈接更多精彩內容