Golang设计模式之装饰器模式

ShawnLee_123 · · 833 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

装饰器模式

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()
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:ShawnLee_123

查看原文:Golang设计模式之装饰器模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

833 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传