關於裝飾者模式的一些理解

2021-08-18 23:05:59 字數 1514 閱讀 9983

裝飾者模式,主要是為了解決在對類進行擴充套件過程中可能出現的子類**,並同時滿足「對擴充套件開放,對修改封閉」的原則。我們以遊戲中的**作為例,遊戲中的**有基本的傷害值,有附加的特效,特效的種模擬較多,且同乙個**會帶有多種特效,例如傷害增強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 ...