1. 程式人生 > 實用技巧 >PHP設計模式 - 門面模式(Facade)

PHP設計模式 - 門面模式(Facade)

打個比方,比如我們要在淘寶買東西,我基本上只需要滑鼠點一些按鈕就完成了。

但是實際上網站的後臺是很多個子系統一起去完成你購買商品的任務的,比如網站系統,購物車系統,訂單系統,使用者中心繫統,支付系統。

這些系統對外通過了統一的介面,讓你在網站上點按鈕就可以完成買東西的需求。這就是門面模式。我的理解起這個名稱的人關注的是由多個介面不統一的子系統對外提供統一的介面,好像形成了一個介面或者門面一樣。

能做什麼?

  • 為一些複雜的子系統提供一組介面。
  • 提高子系統的獨立性。
  • 在層次化結構中,可以使用門面模式定義系統的每一層的介面。

有什麼優勢?

  • 它對客戶遮蔽了子系統元件,因而減少了客戶處理的物件的數目並使得子系統使用起來更加方便。
  • 實現了子系統與客戶之間的鬆耦合關係。
  • 如果應用需要,它並不限制它們使用子系統類。因此可以在系統易用性與能用性之間加以選擇。

例項(通俗易懂)

下面模擬一個"使用者操作裝置",你一看就能恍然大悟!

說了這麼多理論,你可能感到迷惑,想千遍,不如做一遍!

複製貼上,跑起來!

<?php

/**
 * 門面設計模式(Facade)
 * 看不懂你打我!
 */
 
class Camera 
{
 
    /**
     * 開啟錄影機
     */
    public function turnOn()
    {
        echo "開啟錄影機" . '<br/>';
    }
 
    /**
     * 關閉錄影機
     */
    public function turnOff()
    {
        echo "關閉錄影機" . '<br/>';
    }
 
}

class Light
{
 
    /**
     * 開燈
     */
    public function turnOn()
    {
        echo "開燈" . '<br/>';
    }
 
    /**
     * 關燈
     */
    public function turnOff()
    {
        echo "關燈" . '<br/>';
    }
 
    /**
     * 換燈泡
     */
    public function changeBulb()
    {
        echo "換燈泡" . '<br/>';
    }

}
 
class Sensor 
{
 
    /**
     * 啟動感應器
     */
    public function activate()
    {
        echo "啟動感應器" . '<br/>';
    }
 
    /**
     * 關閉感應器
     */
    public function deactivate()
    {
        echo "關閉感應器" . '<br/>';
    }
 
    /**
     * 觸發感應器
     */
    public function trigger()
    {
        echo "觸發感應器" . '<br/>';
    }

}

class Alarm {
 
    /**
     * 啟動警報器
     */
    public function activate()
    {
        echo "啟動報警器" . '<br/>';
    }
 
    /**
     * 關閉警報器
     */
    public function deactivate()
    {
        echo "關閉報警器" . '<br/>';
    }
 
    /**
     * 拉響警報器
     */
    public function ring()
    {
        echo "拉響報警器" . '<br/>';
    }
 
    /**
     * 停掉警報器
     */
    public function stopRing()
    {
        echo "停掉報警器" . '<br/>';
    }

}
 
/**
 * 門面類(Facade)
 * 負責將"分散"的功能提供統一介面
 */
class Facade
{
 
    /* 錄影機 */
    private $_camera;
 
    /* 燈 */
    private $_light;
 
    /* 感應器 */
    private $_sensor;
 
    /* 警報器 */
    private $_alarm;
    
    public function __construct()
    {
        $this->_camera = new Camera();
        $this->_light = new Light();
        $this->_sensor = new Sensor();
        $this->_alarm = new Alarm();
    }
    
    /**
     * 啟動介面: (開啟錄影機/開燈/啟動感應器/啟動報警器)
     * @return void
     */
    public function activate()
    {
        // 開啟錄影機
        $this->_camera -> turnOn();
        // 開燈
        $this->_light -> turnOn();
        // 啟動感應器
        $this->_sensor -> activate();
        // 啟動報警器
        $this->_alarm -> activate();
        // 分隔符(方便觀察)
        echo '<hr>';
    }

    /**
     * 關閉介面: (關閉錄影機/關燈/關閉感應器/關閉報警器)
     * @return void
     */
    public function deactivate()
    {
        // 關閉錄影機
        $this->_camera -> turnOff();
        // 關燈
        $this->_light -> turnOff();
        // 關閉感應器
        $this->_sensor -> deactivate();
        // 關閉報警器
        $this->_alarm -> deactivate();
        // 分隔符(方便觀察)
        echo '<hr>';
    }

    /**
     * 其他功能介面: (換燈泡/觸發感應器/拉響警報器/停掉警報器)
     * @return void
     */
    public function otherFunction()
    {
        // 換燈泡
        $this->_light -> changeBulb();
        // 觸發感應器
        $this->_sensor -> trigger();
        // 拉響警報器
        $this->_alarm -> ring();
        // 停掉警報器
        $this->_alarm -> stopRing();
        // 分隔符(方便觀察)
        echo '<hr>';
    }
}
 
 
/**
 * 客戶端(由使用者觸發介面功能)
 */
class Client
{
 
    private static $_security;
    
    /**
     * 主程式(Main program)
     * @return void
     */
    public static function main()
    {   
        // 例項化門面類(Facade)
        self::$_security = new Facade();

        /**
         * 使用者操作(operation)
         * @activate(): 開啟操作
         * @deactivate(): 關閉操作
         * @otherFunction(): 其他操作
         */
        self::$_security -> activate();
        self::$_security -> deactivate();
        self::$_security -> otherFunction();
    }
}

/**
 * console main();
 */
Client::main();

?>

客戶端結果:

說白了,就是將複雜的功能統一使用一個介面管理起來!