PHP设计模式(七)之门面模式

作者: 温新

分类: 【设计模式】

阅读: 2684

时间: 2020-01-16 14:58:19

一、什么是外观模式(Facade Pattern)

定义:外观模式又称门面模式,提供一个统一的接口,用来访问子系统中的一群接口。

外部与子系统之间的通信采用门面(Facade)对象来完成。

【举例】比如麦当劳套餐,套餐包含鸡肉卷、汉堡包、可乐等N个单个食物(这就是子系统),而套餐就是门面对象。当我们去点一个套餐时,套餐内的食物(子系统)不会一个一个给你送来,而是等套餐内所有食物做好之后一起送给你。有没有发现,这与工厂模式有些相像。

二、为什么使用外面模式

主要用来简化操作。

三、外观模式结构

外观角色(Facade): 为子系统封装统一的对外接口,如同子系统的一个门面。这个类一般不负责具体的业务逻辑,只是一个委托类,具体的业务逻辑由子系统完成。

子系统(SubSystem): 由多个类组成的具有某一特定功能的子系统。可以是第三方库,也可以是自己的基础库,还可能是一个子服务,为整个系统提供特定的功能或服务。

四、实例解释
继续一贯以来的餐饮。厨房电器摆放位置太乱,严重影响了厨房的整洁,老板决定整改整个电路系统。厨房电器太多,一个一个关掉电源太过于浪费时间,有没有总控?对,总控。于是老板直接关掉了整个厨房的电源系统,这下就方便多了。实际常见的有屋子里的空气开关。

五、代码实现

Freezer.php

<?php

/**
 * Freezer 冷藏柜开关 (子系统)
 * 
 */
class Freezer
{
    // 冷藏柜电源 开
    public function open()
    {
        echo '我是冷藏柜,我接通电源了,开始冷藏工作~~';
    }

    // 冷藏柜电源 关
    public function close()
    {
        echo '我是冷藏柜,我失去电源了,冷藏工作结束~~';
    }
}

SteamRiceMachineSwitch.php

<?php

/**
 * SteamRiceMachineSwitch 蒸饭车电源开关控制器 (子系统)
 * 
 */
class SteamRiceMachineSwitch
{
    // 蒸饭车电源 开
    public function turnOn()
    {
        echo '我是蒸饭车,我接通电源了,我将为你蒸饭~';
    }

    // 蒸饭车电源 关
    public function turnOff()
    {
        echo '我是蒸饭车,我接通关闭了,我不再为你蒸饭,你自己想办法去吧~';
    }
}

TurnOffFacade.php

<?php

/**
 * TurnOffFacade 电源总开关门面
 */

class TurnOffFacade
{
    protected $freezer;
    protected $steamRiceMachineSwitch;

    public function __construct()
    {
        $this->freezer = new Freezer();
        $this->steamRiceMachineSwitch = new SteamRiceMachineSwitch();
    }

    // 总开
    public function on()
    {
        $this->freezer->open();
        $this->steamRiceMachineSwitch->turnOn();
    }

    // 总关
    public function off()
    {
        $this->freezer->close();
        $this->steamRiceMachineSwitch->turnOff();
    }       
}

index.php

<?php
require_once './Freezer.php';
require_once './SteamRiceMachineSwitch.php';

require_once './TurnOffFacade.php';

$facade = new TurnOffFacade();

$facade->on();
$facade->off();

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年01月16日

请登录后再评论