PHP設計模式- Decorator 裝飾器模式

無敵小籠包發表於2019-02-16

整理一下自己的學習Aaron Saray 寫的PHP設計模式一些demo和自己的理解。大佬看完如果發現鄙人理解有誤請立即指出,感謝拍磚,跪求鞭打


/**
 * Decorator 裝飾器模式
 * -------------------------------------
 * ** 來自說明 **
 *
 * 如果已有物件的部分內容或功能性發生改變,但是不需要修改原始的結構
 *
 * 剛開始樓主覺得這個他麼怎麼這麼像 【 介面卡模式 】
 * 然後又把介面卡模式的理論複製了過來給各位觀眾老爺看
 * 
 * |-> 介面卡模式: * 通過介面卡模式能夠使用新的程式碼和功能性來幫助更新原有的系統。
 *
 * 前面演練過了,介面卡還是需要繼承原物件來實現,但是我們最開始學習物件導向程式設計時候
 * 如果物件開始要求啟用過多的子類,那麼相應的程式碼就會犧牲程式設計人員的理解力和可維護性
 * 通常,我們會竭力保證用於一個物件的父-子類關係不超過3個
 * 
 * 
 * ===================================== 
 * ** 應用場景 **
 *
 * 迭代新的應用需求
 * 
 * -------------------------------------
 * 
 * @version ${Id}$
 * @author Shaowei Pu <54268491@qq.com>
 */

// 現在你是一個農場飼養員,主要負責養豬方面工作

/**
 * 飼養類
 */
class feeding{

    /**
     * [$mess_tin 飯盒]
     * @var array
     */
    public $mess_tin = [];

    /**
     * [feed 餵食物]
     * @author         Shaowei Pu <pushaowei@sporte.cn>
     * @CreateTime    2017-02-23T19:47:18+0800
     * @param                               [type] $food [description]
     * @return                              [type]       [description]
     */
    public function feed( $food ){
        $this->mess_tin[] = $food;
    }
    /**
     * [getHow 吃了哪些東西]
     * @author         Shaowei Pu <pushaowei@sporte.cn>
     * @CreateTime    2017-02-23T19:51:41+0800
     * @return                              [type] [description]
     */
    public function getHow(){
        return $this->mess_tin;
    }
}

// 以前你通過這樣的方式可以餵豬
$you = new feeding;

// 然後老闆給了這些食物
$bread = [        
        `apple`,
        `tangerine`,
        `banana`,
    ];

foreach ($bread as $key => $value) {
    $you->feed($value);
}

// 看看吃了些啥
var_dump( $you->getHow() );
/* 
+----------------------------------------------------------------------
|array (size=3)
|  0 => string `apple` (length=5)
|  1 => string `tangerine` (length=9)
|  2 => string `banana` (length=6)
+----------------------------------------------------------------------
*/

// 但是有天高階飼養說這喂的這些食物都是小寫的 這不行,給豬必須要大寫的
// 然後你看了下飼養類,聽隔壁兄弟這個類不僅僅用在豬身上
// 也有養羊事業部,羊牛事業部,同樣用的這個類
// 你不能瞎幾把亂改
// 學了介面卡的你馬上想到了 使用【介面卡模式】可以解決問題
// 但是立馬老大就說了不準亂繼承。一個父類最多繼承 3 個子類
// 於是聰明的你想到了這樣一個方法

/**
 * 養豬事業部專用
 */
class feddingDecorator{

    /**
     * [$_feeding 基類容器]
     * @var array
     */
    private $_feeding = [];

    /**
     * [__construct 基類入變數]
     * @author         Shaowei Pu <pushaowei@sporte.cn>
     * @CreateTime    2017-02-23T20:00:58+0800
     * @param                               feeding $feeding [description]
     */
    public function __construct( feeding $feeding )
    {
        $this->_feeding = $feeding;
    }

    /**
     * [expertFeed 高階食物轉換器]
     * @author         Shaowei Pu <pushaowei@sporte.cn>
     * @CreateTime    2017-02-23T20:04:42+0800
     * @return                              [type] [description]
     */
    public function expertFeed()
    {
        array_walk($this->_feeding->mess_tin, function( &$value ){
            $value = strtoupper( $value );
        });
    }
}

// 然後這樣,前期您還是放心喂

$me = new feeding;
foreach ($bread as $key => $value) {
    $me->feed($value);
}

// 然後你喂完了就開始用的養豬專業部使用的高科技了
$stm = new feddingDecorator( $me );
$stm->expertFeed();
// 看看吃了啥
var_dump($me-> getHow());

/* 
+----------------------------------------------------------------------
|array (size=3)
| 0 => string `APPLE` (length=5)
| 1 => string `TANGERINE` (length=9)
| 2 => string `BANANA` (length=6)
+----------------------------------------------------------------------
*/

// 掌聲經久不息

相關文章