18 05 2020

门面模式

模式定义

门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使用子系统更容易使用。


门面模式的优势

它可以对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。 


它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。 Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。 


Facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。 


Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。 


代码示例

Facade\Camera.class.php
<?php
namespace Facade;

class Camera
{
    public function turnOn()
    {
        echo "打开录像机 \n";
    }

    public function turnOff()
    {
        echo "关闭录像机 \n";
    }
}


Facade\Sensor.class.php
<?php
namespace Facade;

class Sensor
{
    public function activate()
    {
        echo "启动感应器 \n";
    }

    public function deactivate()
    {
        echo "关闭感应器 \n";
    }
}


Facade\Facade.class.php
<?php
namespace Facade;

class Facade 
{
    private $camera;
    private $sensor;

    public function __construct()
    {
        $this->camera = new Camera();
        $this->sensor = new Sensor();
    }

    public function activate()
    {
        $this->camera->turnOn();
        $this->sensor->activate();
    }

    public function deactivate()
    {
        $this->camera->turnOff();
        $this->sensor->deactivate();
    }
}


Facade\FacadeTest.php
<?php
spl_autoload_register(function ($className){
    $className = str_replace('\\', '/', $className);
    include $className.".class.php";
});

use Facade\Facade;

$facade = new Facade();
$facade->activate();
$facade->deactivate();


测试示例:

php Facade/FacadeTest.php 

输出:
打开录像机 
启动感应器 
关闭录像机 
关闭感应器


总结

门面模式对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便;实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户;如果应用需要,门面模式并不限制客户程序使用子系统类,因此你可以让客户程序在系统易用性和通用性之间加以选择。




代码地址:https://github.com/798256478/design-patterns/tree/master/Facade