美文网首页
PHP 设计模式 - 结构型 - 门面模式(Facade)

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

作者: SylviaYuan95 | 来源:发表于2021-01-18 15:50 被阅读0次

    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

    相关文章

      网友评论

          本文标题:PHP 设计模式 - 结构型 - 门面模式(Facade)

          本文链接:https://www.haomeiwen.com/subject/zyyeaktx.html