结构性:三. 装饰器模式
装饰器模式是什么
是一种结构型设计模式,它允许你将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。由于目标对象和装饰器遵循同一接口,所以你可以对目标进行多次装饰,最后结果为所有装饰器叠加的行为。
为什么用装饰器模式
需要动态的给一个对象增加功能,并且可以动态的撤销的时候。当系统需要添加新的功能是向主类添加新的字段方法或者逻辑,而新的东西只在某些特殊的情况下才会执行。这个时候装饰模式提供了很好的解决方案。装饰模式把需要添加的功能放在单独的类中,并让这个类包裹它所要装饰的对象。这样就可以在需要是,有选择的按顺序的使用包装功能包装对象。
装饰器模式怎么实现
这里我们的目标对象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
优点
- 装饰器是继承有力的补充,在不改变原有对象的情况下动态的给对象扩展功能。
- 装饰器模式完全准守开闭原则。
缺点
- 装饰器模式会增加更多的类和代码,增加程序的复杂性。