PHP设计模式之外观模式(Facade)入门与应用详解


Posted in PHP onDecember 13, 2019

本文实例讲述了PHP设计模式之外观模式(Facade)入门与应用。分享给大家供大家参考,具体如下:

这个外观模式,就是通过在必需的逻辑和方法的集合前创建简单的外观接口,并且还会隐藏了调用对象的复杂性,它和建造者模式非常相似,建造者模式一般是简化对象的调用的复杂性,但是外观模式一般是简化含有很多逻辑步骤和方法调用的复杂性。

来看下实例,先来描述下:

  • 设计一个User类,里面有getUser获取用户信息接口
  • 在使用getUser这个接口的时候,需要设置用户的用户名和用户年龄
  • 所以在正常情况下,调用getUser接口,需要先实例化User类,然后设置用户信息,最后才调用getUser方法,这个过程是复杂的,如果用户信息非常多的话,或者不断变化的话,调用用户信息类将是维护成本很大的事情,比如,随着业务扩展又添加了用户手机,住址,体重,婚否等信息。
  • 设计了一个UserFacade,里面有一个静态方法getUserCall,这个方法可以直接调用getUser函数。

来看下代码:

<?php
//外观模式,通过在必须的逻辑和方法的集合前创建简单的外观接口,外观设计模式隐藏了来自调用对象的复杂性
class User {
 protected $userName;
 protected $userAge;
 public function setUserName($userName) {
 return $this->userName = $userName;
 }
 public function setUserAge($userAge) {
 return $this->userAge = $userAge;
 }
 public function getUser() {
 echo '用户姓名:' . $this->userName . '; 用户年龄:' . $this->userAge;
 }
}
//创建一个User 类调用接口,简化获取用户getUser方法的调用
class UserFacade {
 public static function getUserCall($userInfo) {
 $User = new User;
 $User->setUserName($userInfo['username']);
 $User->setUserAge($userInfo['userAge']);
 return $User->getUser();
 }
}
$userInfo = array('username' => 'initphp', 'userAge' => 12);
UserFacade::getUserCall($userInfo); //只要一个函数就能将调用类简化

上述实例是网上一个比较经典的案例,很容易理解。

这个外观模式的有点如下:

   (1)对于调用者来说,访问代码变得简洁、非常方便

   (2)由于只在一个地方调用子系统,减少了出错的可能

   (3)Facade类还能使调用者避免不正确地使用内部方法,从而减少错误的发生

来看下结构图:

PHP设计模式之外观模式(Facade)入门与应用详解

还有两张图,大家一起看下吧:

PHP设计模式之外观模式(Facade)入门与应用详解

PHP设计模式之外观模式(Facade)入门与应用详解

最后咱们参考一个网上的例子,设计一个商场统一购买家电和家具的场景,如下:

//家电-冰箱
class BingXiang
{/*{{{*/
  public function buy()
  {
    echo "买冰箱\r\n";
  }
}/*}}}*/
//家电-洗衣机
class XiYiJi
{/*{{{*/
  public function buy()
  {
    echo "买洗衣机\r\n";
  }
}/*}}}*/
//家具-创
class Chuang
{/*{{{*/
  public function buy()
  {
    echo "买床\r\n";
  }
}/*}}}*/
//家具-衣柜
class YiGui
{/*{{{*/
  public function buy()
  {
    echo "买衣柜\r\n";
  }
}/*}}}*/
//商场(Facade)
class ShangChang
{/*{{{*/
  public $bingXiang;
  public $xiYiJi;
  public $chuang;
  public $yiGui;
  public function __construct()
  {
    $this->bingXiang = new BingXiang();
    $this->xiYiJi = new XiYiJi();
    $this->chuang = new Chuang();
    $this->yiGui = new YiGui();
  }
  //家电
  public function buyJiaDian()
  {/*{{{*/
    $this->bingXiang->buy();
    $this->xiYiJi->buy();
  }/*}}}*/
  //家具
  public function buyJiaJu()
  {/*{{{*/
    $this->chuang->buy();
    $this->yiGui->buy();
  }/*}}}*/
}/*}}}*/
class Client
{/*{{{*/
  public static function main($argv)
  {
    $shangChang = new ShangChang();
    //买家电
    $shangChang->buyJiaDian();
    //买家具
    $shangChang->buyJiaJu();
  }
}/*}}}*/
Client::main($argv);
?>

输出结果大家可以自己手动试下。

好啦,本次记录就到这里了。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 高手之路(二)
Oct 09 PHP
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
关于Intype一些小问题的解决办法
Mar 28 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
thinkphp 多表 事务详解
Jun 17 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
Aug 22 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
php+ajax实现无刷新数据分页的办法
Nov 02 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
PHP并发查询MySQL的实例代码
Aug 09 PHP
php实现登录页面的简单实例
Sep 29 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
Dec 13 #PHP
laravel通用化的CURD的实现
Dec 13 #PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 #PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 #PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
Dec 12 #PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 #PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
Dec 12 #PHP
You might like
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
php格式化电话号码的方法
2015/04/24 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
google 搜索框添加关键字实现代码
2010/04/24 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
django 2.0更新的10条注意事项总结
2018/01/05 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python登录注册验证功能实现
2018/06/18 Python
flask中过滤器的使用详解
2018/08/01 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
python wsgiref源码解析
2021/02/06 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
后勤自我鉴定
2013/10/13 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
机电专业大学生职业规划书范文
2014/02/25 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
平遥古城导游词
2015/02/03 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android