概念
 

门面模式又叫外观模式,用来隐藏系统的复杂性,提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

 

构成

1.定义一个(或多个)具备所需接口的新类(门面类Facade)
2.新类门户(门面类Facade)使用原来的系统(包含Hotel,Traffic,ScenicArea三个类)
3.客户使用门面类对象与原系统打交道(客户端只调用Facade)

 

示例

 

我们出去旅行,对于同样的路线,跟团和自费有什么区别。

跟团的好处是省心,缴费以后路线,车,门票都不用再操心了。

自费的好处是今天累了我可以休息,觉得那个景点不错,我可以临时更改行程。


<?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/>";
}
}
//Facade 类
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();

总结

 

其实门面模式我们在不知不觉中用的挺多的,大一些的项目,和其他人对接,第一个层api接口,只接收数据,调用第二层的方法,第二层,就是门面模式了,第三层是各种功能类。门面模式促使我们把底层代码写的很细致,而不是一坨。这样在日后查找功能的时候,前2层的代码逻辑都是很清晰的。