裝飾器模式是什么
是一種結構型設計模式,它允許你將物件放入包含行為的特殊封裝物件中來為原物件系結新的行為,由于目標物件和裝飾器遵循同一介面,所以你可以對目標進行多次裝飾,最后結果為所有裝飾器疊加的行為,
為什么用裝飾器模式
需要動態的給一個物件增加功能,并且可以動態的撤銷的時候,當系統需要添加新的功能是向主類添加新的欄位方法或者邏輯,而新的東西只在某些特殊的情況下才會執行,這個時候裝飾模式提供了很好的解決方案,裝飾模式把需要添加的功能放在單獨的類中,并讓這個類包裹它所要裝飾的物件,這樣就可以在需要是,有選擇的按順序的使用包裝功能包裝物件,
裝飾器模式怎么實作
這里我們的目標物件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
優點
- 裝飾器是繼承有力的補充,在不改變原有物件的情況下動態的給物件擴展功能,
- 裝飾器模式完全準守開閉原則,
缺點
- 裝飾器模式會增加更多的類和代碼,增加程式的復雜性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449795.html
標籤:設計模式
上一篇:設計模式之代理模式
下一篇:設計模式之模板方法模式
