olyqcool 2020-05-04
外观模式(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();
结果:
子系统方法一 子系统方法二 子系统方法三 子系统方法四