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 相关文章推荐
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
Jun 24 PHP
PHP根据IP地址获取所在城市具体实现
Nov 27 PHP
php之curl设置超时实例
Nov 03 PHP
Mac OS下配置PHP+MySql环境
Feb 25 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
PHP数学运算与数据处理实例分析
Apr 01 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
php多线程并发实现方法
Sep 30 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
thinkphp中U方法按路由规则生成url的方法
Mar 12 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
PHP代码覆盖率统计详解
Jul 22 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 选项及相关信息函数库
2006/12/04 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
PHP中strtotime函数使用方法分享
2012/01/10 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
JQuery1.6 使用方法三
2011/11/23 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
2013/01/23 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
基于Vue实现图书管理功能
2017/10/17 Javascript
JavaScript设计模式之装饰者模式定义与应用示例
2018/07/25 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
vue点击按钮实现简单页面的切换
2020/09/08 Javascript
python3实现暴力穷举博客园密码
2016/06/19 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Python3最长回文子串算法示例
2019/03/04 Python
python实现名片管理系统项目
2019/04/26 Python
梅尔倒谱系数(MFCC)实现
2019/06/19 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
ubuntu上安装python的实例方法
2019/09/30 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
四种会话跟踪技术
2015/05/20 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
win sever 2022如何占用操作主机角色
2022/06/25 Servers