目的[1]
门面模式的最初目的并不是为了避免让你阅读复杂的 API 文档,这只是一个附带作用。其实它的本意是为了降低耦合性并且遵循 Demeter 定律。
Facade通过嵌入多个(当然,有时只有一个)接口来解耦访客与子系统,同时也为了降低复杂度。
- Facade 不会禁止你访问子系统
- 你可以(应该)为一个子系统提供多个 Facade
因此一个好的 Facade 里面不会有 new
。如果每个方法里都要构造多个对象,那么它就不是 Facade,而是生成器或者[抽象|静态|简单] 工厂 [方法]。
优秀的 Facade 不会有 new
,并且构造函数参数是接口类型的。如果你需要创建一个新实例,则在参数中传入一个工厂对象。
UML
★官方PHP高级学习交流社群「点击」管理整理了一些资料,BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)以及不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货
代码
{/*** @var OsInterface* 定义操作系统接口变量。*/private $os;/*** @var BiosInterface* 定义基础输入输出系统接口变量。*/private $bios;/*** @param BiosInterface $bios* @param OsInterface $os* 传入基础输入输出系统接口对象 $bios 。* 传入操作系统接口对象 $os 。*/public function __construct(BiosInterface $bios, OsInterface $os){$this->bios = $bios;$this->os = $os;}/*** 构建基础输入输出系统执行启动方法。*/public function turnOn(){$this->bios->execute();$this->bios->waitForKeyPress();$this->bios->launch($this->os);}/*** 构建系统关闭方法。*/public function turnOff(){$this->os->halt();$this->bios->powerDown();}
}
* 创建操作系统接口类 OsInterface 。
*/
interface OsInterface
{/*** 声明关机方法。*/public function halt();/** * 声明获取名称方法,返回字符串格式数据。*/public function getName(): string;
}
* 创建基础输入输出系统接口类 BiosInterface 。
*/
interface BiosInterface
{/*** 声明执行方法。*/public function execute();/*** 声明等待密码输入方法*/public function waitForKeyPress();/*** 声明登录方法。*/public function launch(OsInterface $os);/*** 声明关机方法。*/public function powerDown();
}
测试
use DesignPatternsStructuralFacadeOsInterface;
use PHPUnitFrameworkTestCase;/**
* 创建自动化测试单元 FacadeTest 。
*/
class FacadeTest extends TestCase
{public function testComputerOn(){/** @var OsInterface|PHPUnit_Framework_MockObject_MockObject $os */$os = $this->createMock('DesignPatternsStructuralFacadeOsInterface');$os->method('getName')->will($this->returnValue('Linux'));$bios = $this->getMockBuilder('DesignPatternsStructuralFacadeBiosInterface')->setMethods(['launch', 'execute', 'waitForKeyPress'])->disableAutoload()->getMock();$bios->expects($this->once())->method('launch')->with($os);$facade = new Facade($bios, $os);// 门面接口很简单。$facade->turnOn();// 但你也可以访问底层组件。$this->assertEquals('Linux', $os->getName());}
}
PHP 互联网架构师成长之路*「设计模式」终极指南
PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)
面试10家公司,收获9个offer,2020年PHP 面试问题
★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh(君羊号码856460874)。
2020年最新PHP进阶教程,全系列!
参考
- ^内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题和想看的内容可以在评论提出