定義
在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象
裝飾模式的特點
- 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互
- 裝飾對象包含一個真實對象的引用(reference)
- 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象
- 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
場景:更具Coder的技能 分發工資,會的技能越多發的工資當然也就越多
接口
protocol ICoder {
//技能
func skill()
//工資
func pay()-> Int
}
對象(重點必須繼承統一接口ICoder)
//程序員
class Coder: ICoder {
init(owner: String) {
print("我是\(owner)")
}
func skill() {
}
func pay()-> Int {
return 2000
}
}
裝飾器
//裝飾器 裝飾對象和真實對象有相同的接口ICoder
class Decorator_Coder: ICoder {
var coder: ICoder?
func pay() -> Int {
return coder?.pay() ?? 0
}
func skill() {
coder?.skill()
}
func decorator(_ coder: ICoder) -> ICoder {
//裝飾對象包含一個真實對象的引用
self.coder = coder
return self
}
}
裝飾對象
// 裝飾器對象
class swift: Decorator_Coder {
override func pay() -> Int {
return super.pay() + 1000
}
override func skill() {
super.skill()
//裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。
print("我會swift")
}
}
class weekx: Decorator_Coder {
override func pay() -> Int {
return super.pay() + 1000
}
override func skill() {
super.skill()
print("我會weekx")
}
}
class donet: Decorator_Coder {
override func pay() -> Int {
return super.pay() + 1000
}
override func skill() {
super.skill()
print("我會donet")
}
}
真實對象開始裝飾
var LMD:ICoder=Coder(owner:"李美東")
//裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象
LMD = swift().decorator(LMD)
LMD = weekx().decorator(LMD)
print("工資:\(LMD.pay())")
var WZZ:ICoder=Coder(owner:"王增站")
WZZ = swift().decorator(WZZ)
print("工資:\(WZZ.pay())")
var WT:ICoder=Coder(owner:"王騰")
WT = swift().decorator(WT)
WT = donet().decorator(WT)
print("工資:\(WT.pay())")