裝飾模式
裝飾模式(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)