PHP設計模式之裝飾器模式

2021-09-19 10:06:40 字數 1068 閱讀 4695

修飾模式,是物件導向程式設計領域中,一種動態地往乙個類中新增新的行為的設計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個物件而不是整個類新增一些功能。

將所有的功能建立在繼承體系上會導致系統中的類越來越多,而且當你又要修改他們的分支的時候,可能還會出現重複**

我們來看下面這個例子,為了計算一塊區域的價值,我們把**寫成下面這個樣子:

// 區域抽象類

abstract class area

//森林類,價值100

class forest extends area

}//沙漠類,價值10

class desert extends area

}

上面的**看上去好像沒有什麼問題,但是如果需要給一片被破壞的森林計算價值怎麼辦呢,新增damageforest子類麼?顯然是不可行的,因為很有可能還有其他很多態別疊加的類,這會導致類中可能會有重複的**,且子類也會變的越來越多。

裝飾器模式使用組合和委託,而不是使用繼承來解決上述的問題,我們在來看下面改良過的**:

// 區域抽象類

abstract class area

//森林類,價值100

class forest extends area

}//沙漠類,價值10

class desert extends area

}//區域類的裝飾器類

abstract class areadecorateor extends area

}//被破壞了後的區域,價值只有之前的一半

class damaged extends areadecorateor

}//現在我們來獲取被破壞的森林類的價值

$damageforest = new damaged(new forest());

echo $damageforest->treasure(); //返回50

上面的呼叫方法很像建立了乙個管道,裝飾器模式經常被用於建立過濾器。

可以看到,這樣的模型很具有擴者性,我們可以輕鬆的新增其他裝飾器給區域物件,且不需要更改其他類,

php設計模式之裝飾器模式

裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比 繼承更有彈性的替代方案。有這樣乙個專案,做乙個餐廳訂餐系統。起初的 結構是這樣的。前面有很多beverage的繼承類,現在遇到的問題是牛奶的價錢 了,那麼所有相關的類,我們都要進行調整,比如milk,sugarandmilk類,這...

php設計模式之裝飾器模式

裝飾器模式 可以動態的新增,修改某乙個類的功能 特點 1 建立乙個可以被其他類可以實現的類 2 建立乙個功能類去實現剛才定義的類 發現 裝飾器模式與觀察者模式,介面卡模式,這幾種模式存在著一定的相似關係 定義乙個可以實現的類 inte ce decorator public function aft...

php設計模式之裝飾器

裝飾器模式的理解 在原來類的基礎上改變功能 增加 減少或重寫 實現 原來 乙個簡單的抽象類,乙個實體類實現抽象類,用於簡單的功能。裝飾之後 裝飾抽象類繼承原來簡單的抽象類,並實現原來抽象類中的抽象方法,裝飾器的實現類繼承裝飾器,實現類的建構函式中包含原來簡單抽象類的引用,實現類實現裝飾器類增加的抽象...