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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
PHP 实例化类的一点摘记
Mar 23 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
php实现文件下载功能的几个代码分享
May 10 PHP
js代码实现微博导航栏
Jul 30 PHP
php短信接口代码
May 13 PHP
Laravel中间件实现原理详解
Oct 09 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
ThinkPHP实现生成和校验验证码功能
Apr 28 PHP
form自动提交实例讲解
Jul 10 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 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读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
php上传图片类及用法示例
2016/05/11 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
Vue-路由导航菜单栏的高亮设置方法
2018/03/17 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
React实现全选功能
2020/08/25 Javascript
vue v-model的用法解析
2020/10/19 Javascript
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
Windows下用py2exe将Python程序打包成exe程序的教程
2015/04/08 Python
python paramiko模块学习分享
2017/08/23 Python
pycharm debug功能实现跳到循环末尾的方法
2018/11/29 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
Python魔法方法功能与用法简介
2019/04/04 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
Python PO设计模式的具体使用
2019/08/16 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
用友笔试题目
2016/10/25 面试题
企业文化宣传标语
2014/06/09 职场文书
社区志愿者活动方案
2014/08/18 职场文书
优秀党员自我评价范文
2014/09/15 职场文书
2014年个人年终总结
2015/03/09 职场文书
物流业务员岗位职责
2015/04/03 职场文书
新教师教学工作总结
2015/08/12 职场文书
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
JavaScript架构搭建前端监控如何采集异常数据
2022/06/25 Javascript