PHP 设计模式 - 结构型 - 门面模式(Facade)

2021-01-18  本文已影响0人  SylviaYuan95

1. 模式定义

门面模式(Facade)又称外观模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。

门面模式对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便;实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户;如果应用需要,门面模式并不限制客户程序使用子系统类,因此你可以让客户程序在系统易用性和通用性之间加以选择。 Laravel 中门面模式的使用也很广泛,基本上每个服务容器中注册的服务提供者类都对应一个门面类。

2. UML类图

image.png

3. 示例代码

BiosInterface.php

<?php

namespace DesignPattern\Structural\Facade;
/**
 * BIOS "Basic Input Output System"的缩略词,基本输入输出系统
 * Interface BiosInterface
 * @package DesignPattern\Structural\Facade
 */
interface BiosInterface
{
    /**
     * 执行BIOS
     */
    public function execute();

    /**
     * 等待停止
     */
    public function waitForKeyPress();

    /**
     * 启动操作系统
     *
     * @param OsInterface $os
     */
    public function launch(OsInterface $os);

    /**
     * 关闭BIOS
     */
    public function powerDown();
}

OsInterface.php

<?php

namespace DesignPattern\Structural\Facade;
/**
 * 操作系统
 */
interface OsInterface
{
    /**
     * 停止操作系统
     */
    public function halt();
}

Bios.php

BiosInterface接口的实现类

<?php

namespace DesignPattern\Structural\Facade;
/**
 * BIOS "Basic Input Output System"的缩略词,基本输入输出系统
 * Interface BiosInterface
 * @package DesignPattern\Structural\Facade
 */
class Bios implements BiosInterface
{
    /**
     * 执行BIOS
     */
    public function execute()
    {

    }

    /**
     * 等待停止
     */
    public function waitForKeyPress()
    {

    }

    /**
     * 启动操作系统
     *
     * @param OsInterface $os
     */
    public function launch(OsInterface $os)
    {

    }

    /**
     * 关闭BIOS
     */
    public function powerDown()
    {

    }
}

Linux.php

OsInterface接口的实现类

<?php

namespace DesignPattern\Structural\Facade;
/**
 * 操作系统
 */
class Linux implements OsInterface
{
    /**
     * 停止操作系统
     */
    public function halt()
    {

    }

    public function getName()
    {
        return 'Linux';
    }
}

Facade 门面类

直接跟用户进行交互,通过接口隐藏子系统组件。

<?php

namespace DesignPattern\Structural\Facade;

/**
 * 门面类
 */
class Facade
{

    /**
     * @var OsInterface
     */
    protected $os;

    /**
     * @var BiosInterface
     */
    protected $bios;

    /**
     * 使用依赖注入容器创建此类的实例
     *
     * @param BiosInterface $bios
     * @param OsInterface $os
     */
    public function __construct(BiosInterface $bios, OsInterface $os)
    {
        $this->bios = $bios;
        $this->os = $os;
    }

    /**
     * turn on the system
     */
    public function turnOn()
    {
        $this->bios->execute();
        $this->bios->waitForKeyPress();
        $this->bios->launch($this->os);
    }

    /**
     * turn off the system
     */
    public function turnOff()
    {
        $this->os->halt();
        $this->bios->powerDown();
    }
}

单元测试

<?php


namespace DesignPattern\Tests;

use DesignPattern\Structural\Facade\Bios;
use DesignPattern\Structural\Facade\Facade as Computer;
use DesignPattern\Structural\Facade\Linux;
use PHPUnit\Framework\TestCase;

/**
 * FacadeTest用于测试门面模式
 */
class FacadeTest extends TestCase
{

    public function testComputerOn()
    {
        //注册门面
        $bios = new Bios();
        $os = new Linux();
        $facade = new Computer($bios, $os);

        // 用户直接使用门面,界面简单;对客户屏蔽子系统组件
        $facade->turnOn();
        // 且用户也可以访问较低的组件
        $this->assertEquals('Linux', $os->getName());
    }
}

参考文档:https://laravelacademy.org/post/2807
教程源码:https://github.com/SylviaYuan1995/DesignPatternDemo

上一篇下一篇

猜你喜欢

热点阅读