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者的疑难问答(2)
Oct 09 PHP
一些关于PHP的知识
Nov 17 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
PHP四舍五入精确小数位及取整
Jan 14 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
php结合安卓客户端实现查询交互实例
May 05 PHP
PHP设计模式之装饰者模式代码实例
May 11 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
Zend Framework教程之Application用法实例详解
Mar 14 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 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的几个常用数字判断函数代码
2012/04/24 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
javascript 语法基础 想学习js的朋友可以看看
2009/12/16 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
2016/05/20 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
详解Vue-cli webpack移动端自动化构建rem问题
2018/04/07 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
python在windows下实现备份程序实例
2014/07/04 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
python获取指定路径下所有指定后缀文件的方法
2015/05/26 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python类反射机制使用实例解析
2019/12/30 Python
TensorFlow查看输入节点和输出节点名称方式
2020/01/04 Python
Python实现分数序列求和
2020/02/25 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
应届大学生求职的自我评价
2013/11/17 职场文书
结婚保证书范文
2014/04/29 职场文书
企业职业病防治方案
2014/05/29 职场文书
民主评议党员总结
2014/10/20 职场文书
教育实习指导教师评语
2014/12/31 职场文书
婚庆答谢词
2015/01/04 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python