**小y:**你最喜歡幹什麼?
**比爾·雷澤:**最喜歡衝關打爆大機。
**小y:**比爾,你想對觀眾說些什麼?
**比爾·雷澤:**想挑戰我,隨時奉陪!一顆不夠,給你來三顆!
小y:......
比爾·雷澤作為魂斗羅這麼經典的人物,原來也是乙個粗狂耿直boy呀。為了儲存住他的光輝形象和讓大家更加了解他,小y決定把比爾·雷澤的攻擊技能裝飾一番介紹給大家認識。
**比爾·雷澤在戰場上在戰場上基本上用散彈槍可以橫掃小兵,但是遇到一些特殊的情況還是需要通過g5手雷、集速手雷、爆破飛彈等技能來進行輔助。**那麼如何設定這些技能才合適呢?簡單,小y腦海中立馬閃過幾種方案:
(1)採用繼承的方式,設定乙個比爾·雷澤類,有多少個技能就寫多少個子類來繼承這個比爾·雷澤類。
看完這個圖,小y自己都蒙逼了,每增加乙個技能可以組合出n個子類,這只是乙個比爾·雷澤,再來個艾薇、寒鋒什麼的,那不就要加到天荒地老?
(2)直接抽象乙個角色類,裡面包含了每個角色的技能。
這樣子有多少個角色就增加多少個子類就可以了,不用根據技能增加類,避免造成子類**,但是,每個角色的技能是可以疊加使用的,角色越多或者技能疊加種類越多,那麼就要在超類增加越多的方法,而且直接修改超類不符合開閉原則(超類對擴充套件開放,對修改關閉)。
(3)今天的主題—裝飾模式。
1.裝飾模式定義
裝飾模式(decorator pattern)是一種比較常見的模式,動態地給乙個物件新增一些額外的職責(就增加功能來說,裝飾模式相比生成子類更為靈活)。
2.使用的場景
3.角色介紹
4.案例實現
(1)裝飾模式實現角色裝飾uml圖
①抽象角色類
public abstract class character
複製**
②實現角色比爾·雷澤(對它進行裝飾)
public class billrizer extends character
}複製**
③技能裝飾抽象類
public abstract class skilldecorator extends character
@override
public void attack()
}複製**
④g5手雷技能
public class g5grenadedecorator extends skilldecorator
@override
public void attack()
}複製**
⑤集速手雷技能
public class setspeeddecorator extends skilldecorator
@override
public void attack()
}複製**
⑥爆破飛彈技能
public class explosivemissiledecorator extends skilldecorator
@override
public void attack()
}複製**
⑦客戶端
public class client
}複製**
輸出結果:
①散彈槍進行掃射!g5手雷輔助攻擊!
②散彈槍進行掃射!g5手雷輔助攻擊!集速手雷輔助!爆破飛彈輔助!
複製**
把比爾·雷澤的技能介紹一番,大家會發現原來這個看似粗狂的大漢真的霸氣十足啊,有資格看你不爽就來一句「想挑戰我,隨時奉陪!一顆不夠,給你來三顆」。
三、總結分析
裝飾模式 設計模式系列
裝飾模式 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。優點 把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類。可以有效地把類的核心職責和裝飾功能區分開,而且可以去除相關類中重複的裝飾邏輯。使用場景 下面以乙個小demo為例講解 tshirts shoe kuz...
設計模式系列 裝飾模式
本文屬於設計模式的必讀書籍 head first design patterns 的讀書筆記,有不正確的地方歡迎指正。首先,看看gof對裝飾模式的定義 意圖 動態的給乙個物件新增一些額外的職責。就增加功能來說,裝飾模式比生成子類更加靈活。定義很抽象,讓我們來看看乙個具體的業務場景 在城市的某個 商務...
設計模式系列(四) 裝飾模式
動態的為乙個物件的某些職責新增一些額外的功能,與通過繼承來獲得新功能相比,decorator 更加的靈活 試想一下,如果沒有 decorator,轉而使用繼承,每當想要為乙個物件新增某個功能時,我們就需要生成乙個子類。當需要這些功能的組合時,就要生成更多的具有組合功能的子類。這會產生兩個問題 1.類...