裝飾模式
在不必改變原始類別檔案和使用繼承的情況下,動態地擴充一個物件的功能。它是透過創造一個包裝對象,也就是裝飾來包裹真實的對象。
裝飾模式的特色
(1) 裝飾物件和真實物件有相同的介面。這樣客戶端物件就能以和真實物件相同的方式和裝飾物件互動。
(2) 裝飾物件包含一個真實物件的參考(reference)
(3) 裝飾物件接受所有來自客戶端的請求。它把這些請求轉發給真實的物件。
(4) 裝飾物件可以在轉送這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定物件的結構就可以在外部增加附加的功能。在物件導向的設計中,通常是透過繼承來實現對給定類別的功能擴展。
優點
1. Decorator模式與繼承關係的目的都是要擴充物件的功能,但Decorator可以提供比繼承更多的彈性。
2. 透過使用不同的特定裝飾類別以及這些裝飾類別的排列組合,設計師可以創造出許多不同行為的組合。
缺點
1. 這種比繼承更有彈性機動的特性,也同時意味著更多的複雜性。
2. 裝飾模式會導致設計中出現許多小類,如果過度使用,會使程式變得非常複雜。
3. 裝飾模式是針對抽像元件(Component)類型程式設計。但是,如果你要針對特定元件編程時,就應該重新思考你的應用架構,以及裝飾者是否合適。當然也可以改變Component接口,增加新的公開的行為,實現「半透明」的裝飾者模式。在實際項目中要做出最佳選擇。
php程式碼實例
抽像一個工人類別有工作方法,2個子類別(水管工、木工)實作了工人介面:
interface worker{ public function doSomeWork(); } //水管工 class shuiguan implements worker{ public function doSomeWork(){ echo '修水管'; } } //木工 class mu implements worker{ public function doSomeWork(){ echo '修门窗'; } }
現在有新的需求a公司的工人(包含水管、木工)進門要求先說“您好!”,我們想在不影響基礎類的情況下統一實現這個功能。我們可以使用裝飾模式類別實現:
//a公司工人 class aWorker implements worker{ //具体的工人 public $worker; //构造函数获取工人 public function __construct($worker){ $this->worker = $worker; } public function doSomeWork(){ echo '您好!'; $this->worker->doSomeWork(); } } $aWorker = new aWorker(new shuiguan()); $aWorker->doSomeWork();
aWorker 同樣實現了worker類的接口,它需要一個具體的工人對象,在執行完特殊要求(說您好)後使用原有工人對象的方法。這就是裝飾模式!
以上是裝飾模式詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!