裝飾模式核心內容:
- 裝飾模式可以在不影響組件物件的情況下,以動態、透明的方式從外部給物件添加功能;
- 裝飾器模式的本質就是動態組合,動態是手段,組合是目的,裝飾模式是通過把復雜的功能簡單化、分散化,在運行期間,根據需要來動態組合出需要的功能;
- 使用不同的裝飾類以及這些裝飾類的排列組合,可以創造出很多不同功能的物件,可以使用多個裝飾類來裝飾同一物件,創造功能更為強大的物件;
- 裝飾抽象類的介面必須與組件抽象類的介面相同,對于客戶端來說無論是裝飾之前的物件還是裝飾之后的物件都可以使用同樣的方式呼叫;
- 組件實作類 ConcreteComponent 應該盡量保持簡潔和輕量,不要把主邏輯之外的輔助邏輯和狀態放在組件實作類中,應該通過裝飾類對其進行擴展,
定義一個組件抽象類:
abstract class Component
{
abstract public function operation();
}
定義一個組件實作類,實作組件功能:
class ConcreteComponent extends Component
{
public function operation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
}
}
定義一個裝飾器抽象類,介面與組件類一致:
abstract class Decorator extends Component
{
/**
* 持有Component物件,該物件就是被裝飾的物件
*/
protected $component;
/**
* 構造方法傳入
* @param Component $component
*/
public function __construct(Component $component)
{
$this->component = $component;
}
abstract public function operation();
}
定義兩個裝飾器,用來擴展原有組件的功能,或者實作新的功能:
class ConcreteDecoratorA extends Decorator
{
public function beforeOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
}
public function afterOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
}
public function operation()
{
$this->beforeOperation();
//這里可以呼叫父類的方法,也可以不呼叫直接改寫實作新功能
$this->component->operation();
$this->afterOperation();
}
}
class ConcreteDecoratorB extends Decorator
{
public function beforeOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
}
public function afterOperation()
{
echo __CLASS__ . '|' . __METHOD__ . "\r\n";
}
public function operation()
{
$this->beforeOperation();
//這里可以呼叫父類的方法,也可以不呼叫直接改寫實作新功能
$this->component->operation();
$this->afterOperation();
}
}
客戶端使用示例:
class Client
{
public function main()
{
$component = new ConcreteComponent();
echo "\r\n直接使用組件:\r\n";
$component->operation();
$decoratorA = new ConcreteDecoratorA($component);
echo "\r\n使用裝飾器A裝飾后的組件:\r\n";
$decoratorA->operation();
$decoratorB = new ConcreteDecoratorB($decoratorA);
echo "\r\n使用裝飾器A和B裝飾后的組件:\r\n";
$decoratorB->operation();
}
}
$client = new Client();
$client->main();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20920.html
標籤:PHP
