-
功能
無需改變原有對象的任何屬性及其繼承的情況下,動態(tài)為一個對象添加額外的職責(zé)。
-
實現(xiàn)
通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。
俺是一枚擼友,在這里借用LOL的余熱,形象的將裝飾器模式的實現(xiàn)方式說明下。 我們都知道LOL玩家與土豪玩家最大的區(qū)別在于英雄皮膚數(shù)量以及皮膚的稀有度,為什么那么多玩家喜歡買皮膚?有(裝)錢(X),好(卵)看(用)。越貴的皮膚,它所展示的效果越酷炫。那怎么給英雄裝飾皮膚呢?可以試想象開發(fā)LOL的大神猿人在給每個英雄設(shè)計皮膚的時候,也用到了裝飾器模式。現(xiàn)在,先來看看大體類繼承結(jié)構(gòu)。總共分為4塊,父類(Hero),具體的實現(xiàn)類,也就是具體的ConcreteComponent(ConcreteHero) ,裝飾類(HeroDector),也就是給英雄添加皮膚的裝飾的父類,以及具體的裝飾類(一個英雄的皮膚數(shù)量可不只一個喲~)
接下來,看看具體的代碼(我使用的是Python語言,注意:Python有專門的裝飾模式——裝飾器(Python的語法糖),這里主要介紹設(shè)計模式,在此不做多余的講解,有興趣的小伙伴可以自己去查查Python的裝飾器)。
定義了一個Hero類, 有個四個待實現(xiàn)的方法。(python語法里沒有接口)
class Hero(object):
def __init__(self, name):
self.name = name
def skill_Q(self):
pass
def skill_W(self):
pass
def skill_E(self):
pass
def skill_R(self):
pass
接下來是具體的英雄實現(xiàn)類,嘿嘿,很明顯我實現(xiàn)了一個EZ
class EZHero(Hero):
def __init__(self, name):
super(EZHero, self).__init__(name)
print("我是%s" % self.name)
def skill_Q(self):
print("釋放技能Q....")
def skill_W(self):
print("釋放技能W....")
def skill_E(self):
print("釋放技能E....")
def skill_R(self):
print("釋放技能R....")
再定義一個抽象的裝飾器類,初始化時將具體待裝飾的英雄傳入進(jìn)去
class HeroSkin(Hero):
def __init__(self, hero):
self.hero= hero
def skill_Q(self):
pass
def skill_W(self):
pass
def skill_E(self):
pass
def skill_R(self):
pass
哈哈,最后也就是最重要的類了,具體的皮膚實現(xiàn)類
class SoldierOfFutureSkin(HeroSkin):
def __init__(self,concreteHero):
super(SoldierOfFutureSkin,self).__init__(concreteHero)
print("使用未來者皮膚給EZ進(jìn)行裝飾")
def skill_Q(self):
print("給Q技能加聲音")
print("給Q技能加顏色")
self.concreteHero.skill_Q()
def skill_W(self):
print("給W技能加聲音")
print("給W技能加顏色")
self.concreteHero.skill_W()
def skill_E(self):
print("給E技能加聲音")
print("給E技能加顏色")
self.concreteHero.skill_E()
def skill_R(self):
print("給R技能加聲音")
print("給R技能加顏色")
self.concreteHero.skill_R()
然后運行一下:
if __name__ == "__main__":
ez_Hero = EZHero("EZ")
soldier_future_skin = SoldierOfFutureSkin(ez_Hero)
soldier_future_skin.skill_Q()
soldier_future_skin.skill_W()
soldier_future_skin.skill_E()
soldier_future_skin.skill_R()
#output:
我是EZ
使用未來者皮膚給EZ進(jìn)行裝飾
給Q技能加聲音
給Q技能加顏色
釋放技能Q....
給W技能加聲音
給W技能加顏色
釋放技能W....
給E技能加聲音
給E技能加顏色
釋放技能E....
給R技能加聲音
給R技能加顏色
釋放技能R....
Process finished with exit code 0
好了,裝飾器模式就到這了。初寫文章,還有不對的請多多指教,交流,共同進(jìn)步~!