门面模式
<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"><?php
//子系统类共3个
/**
* 景区
*/
class ScenicArea
{
public function Ticket1()
{
echo "景区1门票<br/>";
}
public function Ticket2()
{
echo "景区2门票<br/>";
}
public function Ticket3()
{
echo "景区3门票<br/>";
}
}
/**
* 交通
*/
class Traffic
{
public function __construct(){}
public function buyBusTicket($from, $to)
{
echo "买入从".$from."到".$to."的汽车票<br/>";
}
public function buyTrainTicket($from, $to)
{
echo "买入从".$from."到".$to."的火车票<br/>";
}
}
/**
* 宾馆
*/
class Hotel
{
public function __construct(){}
public function hotel($place)
{
echo "订下".$place."的旅店<br/>";
}
}
/**
* 门面类
*/
class Facade
{
private $traffic;
private $scenicArea;
private $hotel;
public function __construct()
{
$this->hotel = new Hotel();
$this->traffic = new Traffic();
$this->scenicArea = new ScenicArea();
}
public function oneDay()
{
$this->traffic->buyBusTicket('A','B');
$this->scenicArea->Ticket1();
$this->traffic->buyBusTicket('B','A');
}
public function twoDay()
{
$this->traffic->buyTrainTicket('A','B');
$this->scenicArea->Ticket1();
$this->traffic->buyBusTicket('B','C');
$this->hotel->hotel('C');
$this->scenicArea->Ticket2();
$this->traffic->buyTrainTicket('C','A');
}
}
//客户端调用
$agency = new Facade();
$one = $agency->oneDay();
echo '===========<br/>';
$two = $agency->twoDay();
</code></pre>