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 相关文章推荐
第十五节--Zend引擎的发展
Nov 16 PHP
PHP中MD5函数使用实例代码
Jun 07 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
php中的strpos使用示例
Feb 27 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
May 12 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php实现倒计时效果
Dec 19 PHP
PHP文件下载实例代码浅析
Aug 17 PHP
Yii CFileCache 获取不到值的原因分析
Feb 08 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 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具体实现代码
2010/10/12 PHP
CI框架集成Smarty的方法分析
2016/05/17 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
laravel解决迁移文件一次删除创建字段报错的问题
2019/10/24 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
网页里控制图片大小的相关代码
2006/06/13 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
JS对img标签进行优化使用onerror显示默认图像
2014/04/24 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
详解JavaScript中的事件流和事件处理程序
2016/05/20 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
名片管理系统python版
2018/01/11 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
python3下pygame如何实现显示中文
2020/01/11 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
Dogeared官网:在美国手工制作的珠宝
2019/08/24 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
方正Java笔试题
2014/07/03 面试题
事业单位辞职信范文
2014/01/19 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
运动会跳远广播稿
2015/08/19 职场文书
python之基数排序的实现
2021/07/26 Python
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python