16 PHP 设计模式系列「门面模式(Facade)」

2022-10-11 21:49:07 193 0
魁首哥

1、模式定义

门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。

2、UML类图

3、示例代码

Facade.php

protected  $os;
 /**
 * @var BiosInterface
 */
 protected $bios;
 /**
 * This is the perfect time to use a dependency injection container
 * to create an instance of this class
 *
 * @param BiosInterface $bios
 * @param OsInterface $os
 */
 public function __construct(BiosInterface $bios, OsInterface $os)
 {
 $this->bios = $bios;
 $this->os = $os;
 }
 /**
 * turn on the system
 */
 public function turnOn()
 {
 $this->bios->execute();
 $this->bios->waitForKeyPress();
 $this->bios->launch($this->os);
 }
 /**
 * turn off the system
 */
 public function turnOff()
 {
 $this->os->halt();
 $this->bios->powerDown();
 }
}
 

OsInterface.php


BiosInterface.php


4、测试代码

Tests/FacadeTest.php

getMockBuilder('DesignPatterns\Structural\Facade\BiosInterface')
 ->setMethods(array('launch', 'execute', 'waitForKeyPress'))
 ->disableAutoload()
 ->getMock();
 $os = $this->getMockBuilder('DesignPatterns\Structural\Facade\OsInterface')
 ->setMethods(array('getName'))
 ->disableAutoload()
 ->getMock();
 $bios->expects($this->once())
 ->method('launch')
 ->with($os);
 $os->expects($this->once())
 ->method('getName')
 ->will($this->returnValue('Linux'));
 $facade = new Computer($bios, $os);
 return array(array($facade, $os));
 }
 /**
 * @dataProvider getComputer
 */
 public function testComputerOn(Computer $facade, OsInterface $os)
 {
 // interface is simpler :
 $facade->turnOn();
 // but I can access to lower component
 $this->assertEquals('Linux', $os->getName());
 }
}
 

5、总结

门面模式对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便;实现了子系统与客户之间的 松耦合 关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户;如果应用需要,门面模式并不限制客户程序使用子系统类,因此你可以让客户程序在系统易用性和通用性之间加以选择。

Laravel 中门面模式的使用也很广泛,基本上每个服务容器中注册的服务提供者类都对应一个门面类。

收藏
分享
海报
0 条评论
193
上一篇:php预防sql注入和xss攻击 下一篇:PHP内部开发规范

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码