裝飾者模式,主要是為了解決在對類進行擴充套件過程中可能出現的子類**,並同時滿足「對擴充套件開放,對修改封閉」的原則。我們以遊戲中的**作為例,遊戲中的**有基本的傷害值,有附加的特效,特效的種模擬較多,且同乙個**會帶有多種特效,例如傷害增強10%,攻擊速度增強20%等等,若採用繼承的方式來做,就會產生子類**,同時,如果需要增加一種新的特效的話,就需要修改原來的**。但是如果採用裝飾者模式,就可以比較簡單的解決這個問題,在用**實現之前,我們先畫一下模式圖。
裝飾者模式中分為這麼幾種角色,乙個是抽象元件,對應途中是weapon類,乙個是具體元件,對應各類**,例如sword類,另乙個是抽象裝飾類,抽象裝飾類也繼承於抽象元件,是為了裝飾者中有乙個例項變數以儲存對weapon的引用,最後是具體裝飾類,負責新增具體的特性。具體的實現**如下:
抽象元件:
public abstract class weapon
具體元件:
public class sword:weapon
}
抽象裝飾類:
public abstract class effect:weapon
public override void getdescription()}}
具體裝飾類(增強10%傷害):
public class enhanceattack : effect
public override void getdescription()
}
具體裝飾類(增加10%速度):
public class increasespeed : effect
public override void getdescription()
}
具體使用:
static void main(string args)
結果:
如果後期需要增加新的特效,例如按4%傷害吸取生命,則可以再新建乙個具體裝飾類,而無需更改原先的**。
在上面這個例子中,假設讓具體裝飾類直接繼承抽象元件類,將對weapon的引用直接放到具體裝飾類中,不需要抽象裝飾類也能實現一樣的目的,如**所示:
public class increasespeed : weapon
public override void getdescription()
}
在邏輯不複雜的情況下,用這種方式也能實現一樣的功能,但是當功能比較複雜的時候,比如需要按照步驟執行一些操作的時候,則需要將這些步驟放到抽象裝飾類,然後在具體裝飾類中再根據實際需求裝飾每個步驟。 裝飾者模式理解
餅作為 抽象構件 component 角色 做乙個最簡單的麵餅 4 塊錢,具體構件 concrete component 角色 要加配菜 裝飾 decorator 角色 然後 加雞蛋 1 塊 具體配菜 具體裝飾 concrete decorator 角色 然後 加火腿 1 塊 具體配菜 具體裝飾 c...
關於「裝飾者模式」的一點粗淺理解
裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構 主要目的在於增強介面,而不是擴充套件介面 這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。黑體字就是關鍵字,要想用好該模式,就必須體會著幾個關鍵字的意圖 在 head first設計模...
python裝飾器的一些理解
以乙個帶引數的函式的裝飾器為例子 def debug func def something 指定一毛一樣的引數 print debug enter format func.name return func something 這裡寫func something 好像也可以 debug defsay ...