【裝飾模式中主要角色】
抽象構件(Component)角色:定義一個對象接口,以規範準備接收附加職責的對象,從而能夠給這些對象動態地添加職責。
具體構件(Concrete Component)角色:定義一個將要接收附加職責的類。
裝飾(Decorator)角色:持有一個指向Component對象的指針,並定義一個與Component接口一致的接口。
具體裝飾(Concrete Decorator)角色:負責給構件對象增長附加的職責。 php
【裝飾模式的優缺點】
裝飾模式的優勢:
一、比靜態繼承更靈活;
二、避免在層次結構高層的類有太多的特徵
裝飾模式的缺點:
一、使用裝飾模式會產生比使用繼承關係更多的對象。而且這些對象看上去都很想像,從而使得查錯變得困難。 html
【裝飾模式適用場景】
一、在不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責。
二、處理那些能夠撤消的職責,即須要動態的給一個對象添加功能而且這些功能是能夠動態的撤消的。
三、當不能對生成子類的方法進行擴充時。一種狀況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增加。另外一種狀況多是由於類定義被隱藏,或類定義不能用於生成子類。 this
<?php /** * 裝飾模式 * * 動態的給一個對象添加一些額外的職責,就擴展功能而言比生成子類方式更爲靈活 * */ header("Content-type:text/html;charset=utf-8"); abstract class MessageBoardHandler { public function __construct(){} abstract public function filter($msg); } class MessageBoard extends MessageBoardHandler { public function filter($msg) { return"處理留言板上的內容|".$msg; } } $obj=new MessageBoard(); echo $obj->filter("必定要學好裝飾模式<br/>"); // --- 如下是使用裝飾模式 ---- class MessageBoardDecorator extends MessageBoardHandler { private $_handler=null; public function __construct($handler) { parent::__construct(); $this->_handler = $handler; } public function filter($msg) { return $this->_handler->filter($msg); } } // 過濾html class HtmlFilter extends MessageBoardDecorator { public function __construct($handler) { parent::__construct($handler); } public function filter($msg) { return"過濾掉HTML標籤|".parent::filter($msg);; // 過濾掉HTML標籤的處理 這時只是加個文字 沒有進行處理 } } // 過濾敏感詞 class SensitiveFilter extends MessageBoardDecorator { public function __construct($handler) { parent::__construct($handler); } public function filter($msg) { return"過濾掉敏感詞|".parent::filter($msg); // 過濾掉敏感詞的處理 這時只是加個文字 沒有進行處理 } } $obj=new HtmlFilter(new SensitiveFilter(new MessageBoard())); echo $obj->filter("必定要學好裝飾模式!<br/>");