装饰模式是一种结构型设计模式,允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。
解决的问题?
如果一个类在不同的情况下需要有不同的功能,进行简单的排列组合写完所有功能组合的类代码,那是灾难性的。此时,可以考虑使用装饰器模式,通过附加功能的方式,一步步添加想要的功能。
实现步骤:
- 定义行为接口
- 实体类实现接口
- 定义基础装饰器类,该类仅对实体类进行调用,不添加额外的功能
- 定义实体装饰器类,该类实现附加功能。
优势:
- 你无需创建新子类即可扩展对象的行为。
- 你可以在运行时添加或删除对象的功能。
- 你可以用多个装饰封装对象来组合几种行为。
- 单一职责原则。 你可以将实现了许多不同行为的一个大类拆分为多个较小的类。
劣势:
- 在封装器栈中删除特定封装器比较困难。
- 实现行为不受装饰栈顺序影响的装饰比较困难。
- 各层的初始化配置代码看上去可能会很糟糕。
下面是实现代码:
package main
import "fmt"
// 定义行为接口
type device interface {
enable()
disable()
}
// 实体类实现接口
type radio struct{}
func (r *radio) enable() {
fmt.Println("raido enable default")
}
func (r *radio) disable() {
fmt.Println("radio disable default")
}
// 基础装饰器类
type deviceDecorator struct {
d device
}
func newDeviceDecorator(d device) *deviceDecorator {
return &deviceDecorator{
d: d,
}
}
func (d *deviceDecorator) enable() {
d.d.enable()
}
func (d *deviceDecorator) disable() {
d.d.disable()
}
// 实体装饰器类
type volumeUpDecorator struct {
d device
}
func newVolumeUpDecorator(d device) *volumeUpDecorator {
return &volumeUpDecorator{
d: d,
}
}
func (v *volumeUpDecorator) enable() {
v.d.enable()
fmt.Println("enable volume up\n")
}
func (v *volumeUpDecorator) disable() {
v.d.disable()
fmt.Println("disable volume up\n")
}
func main() {
dd := newDeviceDecorator(&radio{})
vd := newVolumeUpDecorator(dd)
vd.enable()
vd.disable()
}
输出:
raido enable default
enable volume up
radio disable default
disable volume up
从上面的代码看出,实现装饰器模式的就像是俄罗斯套娃一样,对原始功能进行一层层包装。