当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP设计模式之外观模式(Facade)入门与应用详解

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-28 10:46:46 浏览: 评论:0 

本文实例讲述了PHP设计模式之外观模式(Facade)入门与应用,分享给大家供大家参考,具体如下:

这个外观模式,就是通过在必需的逻辑和方法的集合前创建简单的外观接口,并且还会隐藏了调用对象的复杂性,它和建造者模式非常相似,建造者模式一般是简化对象的调用的复杂性,但是外观模式一般是简化含有很多逻辑步骤和方法调用的复杂性。

来看下实例,先来描述下:

设计一个User类,里面有getUser获取用户信息接口

在使用getUser这个接口的时候,需要设置用户的用户名和用户年龄

所以在正常情况下,调用getUser接口,需要先实例化User类,然后设置用户信息,最后才调用getUser方法,这个过程是复杂的,如果用户信息非常多的话,或者不断变化的话,调用用户信息类将是维护成本很大的事情,比如,随着业务扩展又添加了用户手机,住址,体重,婚否等信息。

设计了一个UserFacade,里面有一个静态方法getUserCall,这个方法可以直接调用getUser函数。

来看下代码:

  1. <?php 
  2. //外观模式,通过在必须的逻辑和方法的集合前创建简单的外观接口,外观设计模式隐藏了来自调用对象的复杂性 
  3. class User { 
  4.  protected $userName
  5.  protected $userAge
  6.  public function setUserName($userName) { 
  7.  return $this->userName = $userName
  8.  } 
  9.  public function setUserAge($userAge) { 
  10.  return $this->userAge = $userAge
  11.  } 
  12.  public function getUser() { 
  13.  echo '用户姓名:' . $this->userName . '; 用户年龄:' . $this->userAge; 
  14.  } 
  15. //创建一个User 类调用接口,简化获取用户getUser方法的调用 
  16. class UserFacade { 
  17.  public static function getUserCall($userInfo) { 
  18.  $User = new User; 
  19.  $User->setUserName($userInfo['username']); 
  20.  $User->setUserAge($userInfo['userAge']); 
  21.  return $User->getUser(); 
  22.  } 
  23. $userInfo = array('username' => 'initphp''userAge' => 12); 
  24. UserFacade::getUserCall($userInfo); //只要一个函数就能将调用类简化 

上述实例是网上一个比较经典的案例,很容易理解。

这个外观模式的有点如下:

(1)对于调用者来说,访问代码变得简洁、非常方便

(2)由于只在一个地方调用子系统,减少了出错的可能

(3)Facade类还能使调用者避免不正确地使用内部方法,从而减少错误的发生

来看下结构图:

PHP外观模式 Facade

还有两张图,大家一起看下吧:

PHP外观模式 Facade

PHP外观模式 Facade

最后咱们参考一个网上的例子,设计一个商场统一购买家电和家具的场景,如下:

  1. //家电-冰箱 
  2. class BingXiang 
  3. {/*{{{*/ 
  4.   public function buy() 
  5.   { 
  6.     echo "买冰箱\r\n"
  7.   } 
  8. }/*}}}*/ 
  9. //家电-洗衣机 
  10. class XiYiJi 
  11. {/*{{{*/ 
  12.   public function buy() 
  13.   { 
  14.     echo "买洗衣机\r\n"
  15.   } 
  16. }/*}}}*/ 
  17. //家具-创 
  18. class Chuang 
  19. {/*{{{*/ 
  20.   public function buy() 
  21.   { 
  22.     echo "买床\r\n"
  23.   } 
  24. }/*}}}*/ 
  25. //家具-衣柜 
  26. class YiGui 
  27. {/*{{{*/ 
  28.   public function buy() 
  29.   { 
  30.     echo "买衣柜\r\n"
  31.   } 
  32. }/*}}}*/ 
  33. //商场(Facade) 
  34. class ShangChang 
  35. {/*{{{*/ 
  36.   public $bingXiang
  37.   public $xiYiJi
  38.   public $chuang
  39.   public $yiGui
  40.   public function __construct() 
  41.   { 
  42.     $this->bingXiang = new BingXiang(); 
  43.     $this->xiYiJi = new XiYiJi(); 
  44.     $this->chuang = new Chuang(); 
  45.     $this->yiGui = new YiGui(); 
  46.   } 
  47.   //家电 
  48.   public function buyJiaDian() 
  49.   {/*{{{*/ 
  50.     $this->bingXiang->buy(); 
  51.     $this->xiYiJi->buy(); 
  52.   }/*}}}*/ 
  53.   //家具 
  54.   public function buyJiaJu() 
  55.   {/*{{{*/ 
  56.     $this->chuang->buy(); 
  57.     $this->yiGui->buy(); 
  58.   }/*}}}*/ 
  59. }/*}}}*/ 
  60. class Client 
  61. {/*{{{*/ 
  62.   public static function main($argv
  63.   { 
  64.     $shangChang = new ShangChang(); 
  65.     //买家电 
  66.     $shangChang->buyJiaDian(); 
  67.     //买家具 
  68.     $shangChang->buyJiaJu(); 
  69.   } 
  70. }/*}}}*/ 
  71. Client::main($argv); 
  72. ?> 

输出结果大家可以自己手动试下。

好啦,本次记录就到这里了。

Tags: PHP外观模式 Facade

分享到: