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 nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
Aug 21 PHP
PHP以指定字段为索引返回数据库所取的数据数组
Jun 30 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
php使用Cookie实现和用户会话的方法
Jan 21 PHP
PHP实现的json类实例
Jul 28 PHP
深入理解PHP内核(一)
Nov 10 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
Laravel框架实现利用中间件进行操作日志记录功能
Jun 06 PHP
实例讲解php将字符串输出到HTML
Jan 27 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 PHP
浅谈PHP5.6 与 PHP7.0 区别
Oct 09 PHP
PHP多进程简单实例小结
Nov 09 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获取windows登录用户名的方法
2014/06/24 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
利用PHP实现一个简单的用户登记表示例
2017/04/25 PHP
PHP等比例压缩图片的实例代码
2018/07/26 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
Python中关键字is与==的区别简述
2014/07/31 Python
处理Python中的URLError异常的方法
2015/04/30 Python
Python聊天室实例程序分享
2016/01/05 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
html5使用canvas画三角形
2014/12/15 HTML / CSS
知识改变命运演讲稿
2014/05/21 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
Redis数据结构之链表与字典的使用
2021/05/11 Redis
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python