php设计模式之外观模式

外观模式

为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用,外观模式又称门面模式
使用外观模式的原因:
1,开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
2,维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
3,外观模式可以隐藏来自调用对象的复杂性。

外观模式的目的在于降低系统的复杂程度

目录结构

|facade  #项目根目录
|--Think  #核心类库
|----depot.php  #仓库类
|----facade.php  #外观角色
|----Loder.php  #自动加载类
|----orders.php  #订单类
|----products.php  #商品类
|----user.php  #用户系统
|--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;
    }
}

用户系统 Think/user.php

<?php
/**
 * 用户系统
 */
namespace Think;

class user{
    //完善用户资料
    static function setDate($name){
        $data = "用户名为".$name;
        return $data;
    }
}

仓库类 Think/depot.php

<?php
/**
 * 仓库类
 */
namespace Think;

class depot {
    //发货
    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);
//仓库发货
$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);
        //仓库发货
        $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购买的商品裤子

应用实例: 去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。

优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。

缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。

上一篇 php设计模式之代理模式
下一篇 php设计模式之桥接模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,938评论 2 89
  • 工作 助理 21周工作内容(0523-0529) 0523 周一(中午抵达昆明,准备周四会议事宜) 报销的发票已经...
    喜欢艾薇儿和小甜甜阅读 283评论 0 0
  • 这世界很大,我们很小,微乎其微。在旅途中,小小的我们遇到了同样小小的他们,我们与他们之间有相同也有不同,志趣相...
    溟濛夜雨阅读 361评论 0 0
  • 女孩子护肤品瓶瓶罐罐那个多,水,精华液,美容液,霜,膏,隔离,防晒......,再不爱打扮的女子,各种面膜也都是标...
    60分妈妈Qing阅读 181评论 1 0
  • 第五章终得一见 8、唐僧看瓷瓶儿与逐鹿君走远,心里好不是滋味,但难以言表,便欲与上官雪e等作别,没等上官雪e开口,...
    本无痕阅读 345评论 27 26