PHP学习心得


门面模式

<ul> <li>门面为容器中的类提供了一个静态调用接口,相比于传统的静态方法调用,带来了更好的可测试性和扩展性</li> <li>门面模式结合容器思想,静态调用。门面模式的好处是通类的静态调用一些方法</li> </ul> <h3>门面模式理解</h3> <ul> <li>又称外观模式,用于为子系统中的一组接口提供一个一致的界面。</li> <li>门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:</li> <li>引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦</li> </ul> <h3>目的</h3> <ul> <li>门面模式的最初目的并不是为了避免让你阅读复杂的 API 文档,这只是一个附带作用。其实它的本意是为了降低耦合性并且遵循 Demeter 定律。</li> <li>一个门面旨在通过嵌入许多(但有时只有一个)接口来分离客户端和子系统。当然,也是为了降低复杂度。</li> <li>门面不会禁止你访问子系统。你可以(应该)有多个门面对应一个子系统。这就是为什么一个好的门面里没有 new 的原因。</li> <li>如果每个方法都有多种创建,那并不是一个门面,而是一个构建器 [抽象的 | 静态的 | 简单的] 或是一个工厂 [方法] 。</li> <li>最好的门面是没有 new 的,并且其构造函数带有接口类型提示的参数。 如果你需要创建新的实例,可以使用工厂作为变量。</li> </ul> <h3>例子</h3> <ul> <li><a href="https://blog.csdn.net/wwx890208/article/details/82284330">https://blog.csdn.net/wwx890208/article/details/82284330</a></li> <li>我们出去旅行,对于同样的路线,跟团和自费有什么区别。</li> <li>跟团的好处是省心,缴费以后路线,车,门票都不用再操心了。</li> <li>自费的好处是今天累了我可以休息,觉得那个景点不错,我可以临时更改行程。</li> <li>如果是自费,很显然你会在客户端调用的时候,new完上面的3个子系统类,然后自己组装</li> </ul> <h3>定义</h3> <ul> <li>提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用</li> </ul> <h3>门面模式看法</h3> <ul> <li>门面模式在一些大的项目,其他人对接,第一个层api接口,只接收数据,调用第二层的方法,第二层,就是门面模式,第三层是各种功能类。</li> <li>门面模式促使我们把底层代码写的很细致,而不是一坨。这样在日后查找功能的时候,前2层的代码逻辑都是很清晰的。</li> </ul> <h2>代码示例</h2> <pre><code class="language-PHP">&lt;?php //子系统类共3个 /** * 景区 */ class ScenicArea { public function Ticket1() { echo "景区1门票&lt;br/&gt;"; } public function Ticket2() { echo "景区2门票&lt;br/&gt;"; } public function Ticket3() { echo "景区3门票&lt;br/&gt;"; } } /** * 交通 */ class Traffic { public function __construct(){} public function buyBusTicket($from, $to) { echo "买入从".$from."到".$to."的汽车票&lt;br/&gt;"; } public function buyTrainTicket($from, $to) { echo "买入从".$from."到".$to."的火车票&lt;br/&gt;"; } } /** * 宾馆 */ class Hotel { public function __construct(){} public function hotel($place) { echo "订下".$place."的旅店&lt;br/&gt;"; } } /** * 门面类 */ class Facade { private $traffic; private $scenicArea; private $hotel; public function __construct() { $this-&gt;hotel = new Hotel(); $this-&gt;traffic = new Traffic(); $this-&gt;scenicArea = new ScenicArea(); } public function oneDay() { $this-&gt;traffic-&gt;buyBusTicket('A','B'); $this-&gt;scenicArea-&gt;Ticket1(); $this-&gt;traffic-&gt;buyBusTicket('B','A'); } public function twoDay() { $this-&gt;traffic-&gt;buyTrainTicket('A','B'); $this-&gt;scenicArea-&gt;Ticket1(); $this-&gt;traffic-&gt;buyBusTicket('B','C'); $this-&gt;hotel-&gt;hotel('C'); $this-&gt;scenicArea-&gt;Ticket2(); $this-&gt;traffic-&gt;buyTrainTicket('C','A'); } } //客户端调用 $agency = new Facade(); $one = $agency-&gt;oneDay(); echo '===========&lt;br/&gt;'; $two = $agency-&gt;twoDay(); </code></pre>

页面列表

ITEM_HTML