PHP設計模式系列(二):裝飾模式

裝飾模式

裝飾模式(Decorator Pattern) :動態地給一個對象增加一些額外的職責(Responsibility),就增加對象功能來說,裝飾模式比生成子類實現更爲靈活。其別名也可以稱爲包裝器(Wrapper),與適配器模式的別名相同,但它們適用於不同的場合。根據翻譯的不同,裝飾模式也有人稱之爲“油漆工模式”,它是一種對象結構型模式。

模式結構

裝飾模式包含如下角色:

  • Component: 抽象構件
  • ConcreteComponent: 具體構件
  • Decorator: 抽象裝飾類
  • ConcreteDecorator: 具體裝飾類

結構圖

這裏寫圖片描述

PHP代碼實現

<?php
//Component類
abstract class Component
{
    abstract public function operation();
}

//ConcreteComponent類
class ConcreteComponent extends Component
{
    public function operation()
    {
        var_dump('具體對象操作');
    }
}

//Decorator類
abstract class Decorator extends Component
{
    public function setComponent($component){
        $this->component=$component;
    }
    public function operation()
    {
        if($this->component!=null){
            $this->component->operation();
        }
    }
}

//ConcreteDecoratorA類
class ConcreteDecoratorA extends Decorator
{
    public function operation()
    {
        parent::operation();
        var_dump('裝飾對象A的操作');
    }
}
//ConcreteDecoratorB類
class ConcreteDecoratorB extends Decorator
{
    public function operation()
    {
        parent::operation();
        self::addBehavior();
        var_dump('裝飾對象B的操作');
    }
    public function addBehavior()
    {
        var_dump('裝飾對象B獨有操作');
    }
}

$a=new ConcreteComponent();
$b1=new ConcreteDecoratorA();
$b2=new ConcreteDecoratorB();
$b1->setComponent($a);
$b2->setComponent($b1);
$b2->operation();

運行結果

string '具體對象操作' (length=18)
string '裝飾對象A的操作' (length=22)
string '裝飾對象B獨有操作' (length=25)
string '裝飾對象B的操作' (length=22)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章