PHP设计模式—外观模式
Posted 幽篁晓筑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP设计模式—外观模式相关的知识,希望对你有一定的参考价值。
定义:
外观模式(Facade):又叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
代码实例:
假设实现一个功能需要用到子系统中的四个方法。
/** * Class SubSystemOne */ class SubSystemOne { public function methodOne() { return ‘子系统方法一‘ . ‘<br>‘; } } /** * Class SubSystemTwo */ class SubSystemTwo { public function methodTwo() { return ‘子系统方法二‘ . ‘<br>‘; } } /** * Class SubSystemThree */ class SubSystemThree { public function methodThree() { return ‘子系统方法三‘ . ‘<br>‘; } } /** * Class SubSystemFour */ class SubSystemFour { public function methodFour() { return ‘子系统方法四‘ . ‘<br>‘; } }
如果不使用外观模式,客户端代码应该为:
$subSystemOne = new SubSystemOne(); $subSystemTwo = new SubSystemTwo(); $subSystemThree = new SubSystemThree(); $subSystemFour = new SubSystemFour(); echo $subSystemOne->methodOne(); echo $subSystemTwo->methodTwo(); echo $subSystemThree->methodThree(); echo $subSystemFour->methodFour();
这样的写法需要客户端了解子系统的具体实现方法,且代码没有解耦,如果子系统发生变化,则所有的客户端调用都需要进行相应的变化。
以下使用外观模式:
新增外观类Facade.php
/** * 外观类,整合需要调用的子系统代码,给客户端调用,如果子系统发生变化,只用修改外观类代码 * Class Facade */ class Facade { /** * @var */ private $subSystemOne; /** * @var */ private $subSystemTwo; /** * @var */ private $subSystemThree; /** * @var */ private $subSystemFour; /** * Facade constructor. */ public function __construct() { $this->subSystemOne = new SubSystemOne(); $this->subSystemTwo = new SubSystemTwo(); $this->subSystemThree = new SubSystemThree(); $this->subSystemFour = new SubSystemFour(); } /** * 整合方法 */ public function method() { echo $this->subSystemOne->methodOne(); echo $this->subSystemTwo->methodTwo(); echo $this->subSystemThree->methodThree(); echo $this->subSystemFour->methodFour(); } }
客户端调用:
$facade = new Facade(); // 客户端可以不用知道子系统的存在,调用外观类中提供的方法就可以 $facade->method();
结果:
子系统方法一
子系统方法二
子系统方法三
子系统方法四
总结:
- 外观模式能够为复杂系统提供简单且清晰的接口。
- 外观模式只为系统中的某一层或子系统提供单一入口,能够帮助我们解耦项目中的不同部分,客户端只需调用一些简单方法,而不需要了解子系统的内部函数。
- 当子系统发生变化时,只会对一个地方产生影响。
- 如果希望客户端代码能简单地调用子系统或系统地改动不会影响客户端代码,那么就可以使用外观模式。
以上是关于PHP设计模式—外观模式的主要内容,如果未能解决你的问题,请参考以下文章