PHP設計模式:裝飾器模式

PHP設計模式:裝飾器模式

 

前言

裝飾器模式可以隨心所欲動態的添加屬性,最大程度上實現了靈活性
主要分爲

  • 被裝飾的物品
  • 裝飾的組件

裝飾器模式中,可以隨意的將組件和被裝飾品抽象

  • 被裝飾的物品抽象
  • 裝飾的組件抽象
  • 兩個一起抽象
  • 兩個都不抽象
  • 愛怎麼搞怎麼搞

其中,帶着抽象的代碼示例爲:

<?php

//聲明一個裝飾抽象類
abstract class Component
{
    //定義一個操作
    abstract public function operation();
}

class MyOperation extends Component
{
    public function operation()
    {
        echo '這是要進行的操作' . PHP_EOL;
    }
}

//聲明一個裝飾品抽象類繼承裝飾抽象類
abstract class Ornament extends Component
{
    //聲明一個受保護的變量用來掛載傳入的實例
    protected $mountClass;

    //構造函數中把需要掛載的實例掛載到變量中
    public function setMountClass($mountClass)
    {
        $this->mountClass = $mountClass;
    }

    //定義一個裝飾行爲,執行被掛載實例的operation()方法
    public function operation()
    {
        if ($this->mountClass != null) {
            $this->mountClass->operation();
        }
    }
}

//定義第一個裝飾品
class OrnamentCreateA extends Ornament
{
    //重寫父類的裝飾行爲,但是重點是必須執行一次父類裝飾行爲
    public function operation()
    {
        //執行完之後就是這個類需要裝飾什麼東西了,在這裏可以裝飾在前面,也可以裝飾在後,可以隨便折騰
        echo '我是一個前置裝飾器' . PHP_EOL;
        parent::operation();//執行了父類的裝飾行爲
    }
}

//定義第一個裝飾品,這次來實驗一下後置裝飾器
class OrnamentCreateB extends Ornament
{
    //重寫父類的裝飾行爲,但是重點是必須執行一次父類裝飾行爲
    public function operation()
    {
        parent::operation();//執行了父類的裝飾行爲
        echo '我是一個後置裝飾器' . PHP_EOL;
    }
}

$MyOperation = new MyOperation();//實例化你的操作
$OrnamentA = new OrnamentCreateA();//實例化裝飾品A
$OrnamentB = new OrnamentCreateB();//實例化裝飾品B
//操作的順序是將你的操作丟給一個裝飾器,在裝飾第二個的時候直接把第一個裝飾器丟進去,以此類推
$OrnamentA->setMountClass($MyOperation);
$OrnamentB->setMountClass($OrnamentA);
$OrnamentB->operation();

 

 

輸出:

image.png

如果不抽象的話,也可以直接繼承使用

//聲明一個人類
class People
{
    //聲明一個變量用來掛載名字
    protected $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    //定義人類有穿衣服的功能
    public function dress()
    {
        echo $this->name . "開始穿衣服了:";
    }
}

//定義一個裝飾類
class Finery
{
    protected $people;

    public function bindPeople($people)
    {
        $this->people = $people;
    }

    public function dress()
    {
        if ($this->people != null) {
            //這裏其實調用的是人的dress
            $this->people->dress();
        }
    }
}

//定義一個草裙
class Hula extends Finery
{
    public function dress()
    {
        parent::dress();
        echo '穿上了草裙' . PHP_EOL;
    }
}

//定義一個棍子
class Stick extends Finery
{
    public function dress()
    {
        parent::dress();
        echo '舉着一根超大的棍子' . PHP_EOL;
    }
}

//定義一個鞋子
class Shoes extends Finery
{
    public function dress()
    {
        parent::dress();
        echo '穿一雙馬靴' . PHP_EOL;
    }
}

$people = new People('小明');
//實例化草裙,棍子,和鞋子
$hula = new Hula();
$stick = new Stick();
$shoes = new Shoes();

//開始裝飾
$hula->bindPeople($people);
$stick->bindPeople($hula);
$shoes->bindPeople($stick);
$shoes->dress();

 

 

輸出:

image.png

光是看是很難理解的。最好的辦法是動手自己擼一次!

發佈了111 篇原創文章 · 獲贊 79 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章