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简单命令代码集锦
Sep 24 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
php导出word格式数据的代码实例
Nov 25 PHP
php 生成短网址原理及代码
Jan 23 PHP
php递归删除目录与文件的方法
Jan 30 PHP
php中二维数组排序问题方法详解
Aug 28 PHP
yii2超好用的日期组件和时间组件
May 05 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
laravel Model 执行事务的实现
Oct 10 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
详细分析PHP7与PHP5区别
Jun 26 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编写的简单页面跳转功能实现代码
2013/11/27 PHP
使用php显示搜索引擎来的关键词
2014/02/13 PHP
phpStudy访问速度慢和启动失败的解决办法
2015/11/19 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
2016/11/16 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
jquery 常用操作方法
2010/01/28 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
jQuery弹出遮罩层效果完整示例
2016/09/13 Javascript
Knockout结合Bootstrap创建动态UI实现产品列表管理
2016/09/14 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
react native 文字轮播的实现示例
2018/07/27 Javascript
js操作table中tr的顺序实现上移下移一行的效果
2018/11/22 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
Node.js+Express+Mysql 实现增删改查
2019/04/03 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
python实现控制台打印的方法
2019/01/12 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
Noon埃及:埃及在线购物
2019/11/26 全球购物
农药学硕士毕业生自荐信
2013/09/25 职场文书
计算机应用专业毕业生求职信
2013/10/24 职场文书
应急管理培训方案
2014/06/12 职场文书