装饰器模式
GitHub代码链接
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。
什么是装饰器模式
装饰器模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整的前提下,提供了额外的功能。
解决了什么问题
一般的,我们为了拓展一个类经常使用继承的方式实现,由于继承类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。使用装饰器模式,可以不添加很多子类,实现类的拓展。
优点
装饰器类和被装饰类可以独立发展,不会互相耦合
缺点
多层装饰比较复杂
代码实现
我们将把一个模型装饰上不同颜色,同时不改变模型类。
1.1 模型接口实现
//Shape 模型接口
type Shape interface {
Draw()
}
1.2 模型类实现
//Circle 圆形类
type Circle struct{}
//NewCircle 实例化圆形
func NewCircle() *Circle {
return &Circle{}
}
//Draw 输出方法,实现Shape接口
func (c *Circle) Draw() {
fmt.Println("Circle Draw method.")
}
1.2 红色装饰器实现
//RedShapeDecorator 红色装饰器
type RedShapeDecorator struct {
DecoratedShape Shape
}
//NewRedShapeDecorator 实例化红色装饰器
func NewRedShapeDecorator(decShape Shape) *RedShapeDecorator {
return &RedShapeDecorator{
DecoratedShape: decShape,
}
}
//SetRedBorder 装饰器方法
func (rs *RedShapeDecorator) SetRedBorder() {
fmt.Println("Border Color: red")
}
//Draw 实现Shape接口的方法
func (rs *RedShapeDecorator) Draw() {
rs.DecoratedShape.Draw()
rs.SetRedBorder()
}