裝飾器模式(decorator pattern)允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。
拿最近比較火的吃雞遊戲(絕地求生:大逃殺pubg)來說,遊戲中每個玩家降落到島上,剛開始是一無所有的,需要通過撿拾或掠奪裝備來武裝自己,然後經過互相殘酷的拼殺,獲得遊戲的勝利。
遊戲過程中,我們可以把每乙個玩家當成需要裝飾的主類。其餘的**當成裝飾類。玩家可以被任何**裝飾,從而獲得不同的能力。
下面例子中,玩家主類分別通過手槍類和狙擊步槍(kar98)類修飾後,強化了自身的 fire 方法。獲取了不一樣的功能。與此同時,類裡的其他方法 sayname 並沒有受到裝飾器的影響。
// 被裝飾的玩家
class
player
sayname()
`)}fire()
}// 裝飾器——手槍
class
pistol
fire()
}//裝飾器——kar98狙擊步槍
class
kar98
fire()
}// 新玩家
const player =
newplayer
('zkk'
)//打招呼
player.
sayname()
// => 'i am zkk'
// 現在還沒有**,只會用拳頭
player.
fire()
// => 'i can only punch!'
// 哎,撿到乙個手槍,裝飾上
const playerwithpistol =
newpistol
(player)
// 發現敵人,*****
playerwithpistol.
fire()
// => 'i shoot with my pistol!'
// 哇!撿到乙個98k,裝飾上
const playerwithkar98 =
newkar98
(player)
// 用98k**,奈斯!
playerwithkar98.
fire()
// => 'i shoot with my kar98!'
通過例項,我們可以看出裝飾器模式可以動態地給乙個物件新增一些額外的功能,同時結構上更加靈活。
如果不使用裝飾者模式,為了實現以上功能,我們就需要對玩家和各種**的組合建立無數多的類,在需要的時候再去例項化。這樣的管理是非常複雜的。優點
缺點目前 ts 和 es7 已經支援裝飾器的使用,下面是新語法中方法裝飾器的使用。
方法裝飾器表示式會在執行時當作函式被呼叫,傳入下列3個引數:
// 定義kar98方法裝飾器
letkar98
=(target, name, descriptor)
=>
功能被增強`
) console.
log(
'i can fire with kar98!')}
}// 玩家類
class
player
// 用kar98裝飾器裝飾fire方法,就可以公升級能力了。
@kar98
fire
(s: string)
}const player =
newplayer()
player.
fire
('i can punch!'
)
輸出:
除了方法裝飾器,還有類裝飾器,屬性裝飾器,引數裝飾器等等。使用詳情可以參照 ts 使用手冊裝飾器一節
設計模式 裝飾器模式
裝飾器模式 decorator pattern 允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。public inte ce playe...
設計模式 裝飾器模式
裝飾者模式的應用場景 裝飾者模式 decorator pattern 是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案 擴充套件原有物件的功能 屬於結構型模式。裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋 給蛋糕加上一些水果 給房子裝修等,為物件擴充套件一些額外...
設計模式 裝飾器模式
定義 裝飾模式可以動態的給乙個物件增加一些額外的功能 增強功能 相比於繼承,裝飾模式能對不支援繼承的類進行增強 並且比繼承更靈活,不需要生成大量的子類。角色 實現 public abstract class house public abstract void sleep public class ...