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

浅谈PHP设计模式之门面模式Facade

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-27 14:53:39 浏览: 评论:0 

门面模式的最初目的并不是为了避免让你阅读复杂的 API 文档,这只是一个附带作用,其实它的本意是为了降低耦合性并且遵循 Demeter 定律。

目的

Facade通过嵌入多个(当然,有时只有一个)接口来解耦访客与子系统,同时也为了降低复杂度。

Facade 不会禁止你访问子系统

你可以(应该)为一个子系统提供多个 Facade

因此一个好的 Facade 里面不会有 new 。如果每个方法里都要构造多个对象,那么它就不是 Facade,而是生成器或者[抽象|静态|简单] 工厂 [方法]。

优秀的 Facade 不会有 new,并且构造函数参数是接口类型的。如果你需要创建一个新实例,则在参数中传入一个工厂对象。

UML

浅谈PHP设计模式之门面模式Facade

代码

Facade.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\Facade; 
  4.  
  5. class Facade 
  6.     /** 
  7.     * @var OsInterface 
  8.     * 定义操作系统接口变量。 
  9.     */ 
  10.     private $os
  11.  
  12.     /** 
  13.     * @var BiosInterface 
  14.     * 定义基础输入输出系统接口变量。 
  15.     */ 
  16.     private $bios
  17.  
  18.     /** 
  19.     * @param BiosInterface $bios 
  20.     * @param OsInterface $os 
  21.     * 传入基础输入输出系统接口对象 $bios 。 
  22.     * 传入操作系统接口对象 $os 。 
  23.     */ 
  24.     public function __construct(BiosInterface $bios, OsInterface $os
  25.     { 
  26.         $this->bios = $bios
  27.         $this->os = $os
  28.     } 
  29.  
  30.     /** 
  31.     * 构建基础输入输出系统执行启动方法。 
  32.     */ 
  33.     public function turnOn() 
  34.     { 
  35.         $this->bios->execute(); 
  36.         $this->bios->waitForKeyPress(); 
  37.         $this->bios->launch($this->os); 
  38.     } 
  39.  
  40.     /** 
  41.     * 构建系统关闭方法。 
  42.     */ 
  43.     public function turnOff() 
  44.     { 
  45.         $this->os->halt(); 
  46.         $this->bios->powerDown(); 
  47.     } 

OsInterface.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\Facade; 
  4.  
  5. /** 
  6. * 创建操作系统接口类 OsInterface 。 
  7. */ 
  8. interface OsInterface 
  9.     /** 
  10.     * 声明关机方法。 
  11.     */ 
  12.     public function halt(); 
  13.  
  14.     /**  
  15.     * 声明获取名称方法,返回字符串格式数据。 
  16.     */ 
  17.     public function getName(): string; 

BiosInterface.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\Facade; 
  4.  
  5. /** 
  6. * 创建基础输入输出系统接口类 BiosInterface 。 
  7. */ 
  8. interface  BiosInterface 
  9.     /** 
  10.     * 声明执行方法。 
  11.     */ 
  12.     public function execute(); 
  13.  
  14.     /** 
  15.     * 声明等待密码输入方法 
  16.     */ 
  17.     public function waitForKeyPress(); 
  18.  
  19.     /** 
  20.     * 声明登录方法。 
  21.     */ 
  22.     public function launch(OsInterface $os); 
  23.  
  24.     /** 
  25.     * 声明关机方法。 
  26.     */ 
  27.     public function powerDown(); 

测试

Tests/FacadeTest.php

  1. <?php 
  2.  
  3. namespace DesignPatterns\Structural\Facade\Tests; 
  4.  
  5. use DesignPatterns\Structural\Facade\Facade; 
  6. use DesignPatterns\Structural\Facade\OsInterface; 
  7. use PHPUnit\Framework\TestCase; 
  8.  
  9. /** 
  10. * 创建自动化测试单元 FacadeTest 。 
  11. */ 
  12. class FacadeTest extends TestCase 
  13.     public function testComputerOn() 
  14.     { 
  15.         /** @var OsInterface|\PHPUnit_Framework_MockObject_MockObject $os */ 
  16.         $os = $this->createMock('DesignPatterns\Structural\Facade\OsInterface'); 
  17.  
  18.         $os->method('getName'
  19.             ->will($this->returnValue('Linux')); 
  20.  
  21.         $bios = $this->getMockBuilder('DesignPatterns\Structural\Facade\BiosInterface'
  22.             ->setMethods(['launch''execute''waitForKeyPress']) 
  23.             ->disableAutoload() 
  24.             ->getMock(); 
  25.  
  26.         $bios->expects($this->once()) 
  27.             ->method('launch'
  28.             ->with($os); 
  29.  
  30.         $facade = new Facade($bios$os); 
  31.  
  32.         // 门面接口很简单。 
  33.         $facade->turnOn(); 
  34.  
  35.         // 但你也可以访问底层组件。 
  36.         $this->assertEquals('Linux'$os->getName()); 
  37.     } 
  38. }

Tags: PHP设计模式 Facade

分享到: