裝飾模式詳解

藏色散人
發布: 2023-04-05 20:54:01
轉載
2994 人瀏覽過

裝飾模式

在不必改變原始類別檔案和使用繼承的情況下,動態地擴充一個物件的功能。它是透過創造一個包裝對象,也就是裝飾來包裹真實的對象。

裝飾模式的特色

(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中文網其他相關文章!

相關標籤:
來源:hcoder.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!