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实现AES256加密算法实例
Sep 22 PHP
php实现的zip文件内容比较类
Sep 24 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
Yii2实现上下联动下拉框功能的方法
Aug 10 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP实现页面静态化深入讲解
Mar 04 PHP
如何判断微信付款码和支付宝付款码
Apr 01 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调用mysql数据 dbclass类
2011/05/07 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
基于JavaScript 类的使用详解
2013/05/07 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
angularjs的一些优化小技巧
2014/12/06 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
jQuery设计思想
2017/03/07 Javascript
JS实现留言板功能
2017/06/17 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
Python中的条件判断语句基础学习教程
2016/02/07 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python异常的检测和处理方法
2018/10/26 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
python异常处理和日志处理方式
2019/12/24 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Python 字典中的所有方法及用法
2020/06/10 Python
The North Face北面德国官网:美国著名户外品牌
2018/12/12 全球购物
KIKO MILANO西班牙官网:意大利领先的化妆品和护肤品品牌
2019/05/03 全球购物
GetYourGuide台湾:预订旅游活动、景点和旅游项目
2019/06/10 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
struct和class的区别
2015/11/20 面试题
物业经理求职自我评价
2013/09/22 职场文书
单位车辆管理制度
2015/08/05 职场文书
如何利用opencv判断两张图片是否相同详解
2021/07/07 Python