設計模式系列之 裝飾模式

2021-09-24 06:51:58 字數 1976 閱讀 1380

**小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.類...