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
光是看是很難理解的。最好的辦法是動手自己擼一次!