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文件上传的例子及参数详解
Dec 12 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
May 19 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
php设计模式之单例模式实例分析
Feb 25 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
如何使用PHP给图片加水印
Oct 12 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
php实现微信支付之企业付款
May 30 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
Jan 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
浅析php学习的路线图
2013/07/10 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php自定义hash函数实例
2015/05/05 PHP
php动态变量定义及使用
2015/06/10 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
php有效防止图片盗用、盗链的两种方法
2016/11/01 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
一个基于jquery的图片切换效果
2010/07/06 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
jquery 跳到顶部和底部动画2句代码简单实现
2013/07/18 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
Vue.js常用指令汇总(v-if、v-for等)
2016/11/03 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
jQuery实现模拟flash头像裁切上传功能示例
2016/12/11 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
微信小程序自定义导航栏
2018/12/31 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
PHP中如何创建和修改数组
2012/05/02 面试题
一道Delphi上机题
2012/06/04 面试题
80后婚前协议书范本
2014/10/24 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python