裝飾器模式是什麼 是一種結構型設計模式,它允許你將對象放入包含行為的特殊封裝對象中來為原對象綁定新的行為。由於目標對象和裝飾器遵循同一介面,所以你可以對目標進行多次裝飾,最後結果為所有裝飾器疊加的行為。 為什麼用裝飾器模式 需要動態的給一個對象增加功能,並且可以動態的撤銷的時候。當系統需要添加新的功 ...
裝飾器模式是什麼
是一種結構型設計模式,它允許你將對象放入包含行為的特殊封裝對象中來為原對象綁定新的行為。由於目標對象和裝飾器遵循同一介面,所以你可以對目標進行多次裝飾,最後結果為所有裝飾器疊加的行為。
為什麼用裝飾器模式
需要動態的給一個對象增加功能,並且可以動態的撤銷的時候。當系統需要添加新的功能是向主類添加新的欄位方法或者邏輯,而新的東西只在某些特殊的情況下才會執行。這個時候裝飾模式提供了很好的解決方案。裝飾模式把需要添加的功能放在單獨的類中,並讓這個類包裹它所要裝飾的對象。這樣就可以在需要是,有選擇的按順序的使用包裝功能包裝對象。
裝飾器模式怎麼實現
這裡我們的目標對象ConcreteComponent有一個Calc方法。然後MulDecorator和AddDecorator兩個裝飾器分別來擴展目標對象的功能。
目標
package decorator
type Component interface {
Calc()int
}
type ConcreteComponent struct{}
func (c *ConcreteComponent) Calc() int {
return 0
}
MulDecorator裝飾器
type MulDecorator struct {
Component
num int
}
func WarpMulDecorator(c Component, num int) Component {
return &MulDecorator{
Component: c,
num: num,
}
}
func (d *MulDecorator) Calc() int {
return d.Component.Calc() * d.num
}
AddDecorator裝飾器
type AddDecorator struct {
Component
num int
}
func WarpAddDecorator(c Component, num int) Component {
return &AddDecorator{
Component: c,
num: num,
}
}
func (d *AddDecorator) Calc() int {
return d.Component.Calc() + d.num
}
調用示例
func main() {
c := new(ConcreteComponent)
fmt.Println(c.Calc())
addDecorator := WarpAddDecorator(c,9)
fmt.Println(addDecorator.Calc())
mulDecorator := WarpMulDecorator(addDecorator,6)
fmt.Println(mulDecorator.Calc())
}
// 結果:
// 0
// 9
// 54
優點
- 裝飾器是繼承有力的補充,在不改變原有對象的情況下動態的給對象擴展功能。
- 裝飾器模式完全準守開閉原則。
缺點
- 裝飾器模式會增加更多的類和代碼,增加程式的複雜性。