大話設計模式斷了好久,正好最近在研究無埋點技術接觸到了ASM操作字節碼,也就隨之接觸到了裝飾器模式,於是仔細的學習了一下。
張六兒是一個網癮少年,最喜歡玩的遊戲就是Dota2了,衆所周知Dota2是一個免費遊戲(???),但是遊戲中還是可以通過花錢購買英雄飾品讓你的英雄變得十分炫酷(G胖的微笑)。張六兒喜歡影魔這個英雄,但是他覺得原始版的影魔模型實在是太太太太XX的醜了,於是他就花了200大洋買了一個影魔至寶飾品給影魔裝上了,影魔還是那個影魔,只不過張六兒現在可以玩升級版的帶有至寶特效的影魔啦,再給影魔加了一層包裝裝飾之後,影魔就擁有了釋放酷炫技能和霸氣外觀的“功能”。
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作爲現有的類的一個包裝。這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
爲了實現裝飾器模式,我們先來創建一個
public interface DotaHero {
void castSkill();
}
public class ShadowFiend implements DotaHero {
@Override
public void castSkill(){
System.out.println("影魔釋放了魂之輓歌!");
}
}
public abstract class HeroDecorator implements DotaHero {
protected DotaHero hero;
public HeroDecorator(DotaHero hero) {
this.hero = hero;
}
public void castSkill() {
hero.castSkill();
}
}
public class ZhibaoSF extends HeroDecorator {
public ZhibaoSF(DotaHero hero){
super(hero);
}
@Override
public void castSkill() {
hero.castSkill();
dressDecoration();
}
public void dressDecoration(){
System.out.println("給影魔穿上至寶!技能效果改變!");
}
}
public class DecoratorDemo {
public static void main(String args[]){
HeroEquipDecorator ShadowFiend = new HeroEquipDecorator(new ShadowFiend());
ShadowFiend.castSkill();
}
}
優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。
缺點:多層裝飾比較複雜。
使用場景: 1、擴展一個類的功能。 2、動態增加功能,動態撤銷。
注意事項:可代替繼承。