前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 设计模式- 装饰器模式

Go 设计模式- 装饰器模式

作者头像
王小明_HIT
发布2021-07-27 16:34:17
4180
发布2021-07-27 16:34:17
举报
文章被收录于专栏:程序员奇点程序员奇点

装饰模式使用对象组合的方式动态改变或增加对象行为。Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式。使用匿名组合,在装饰器中不必显式定义转调原对象方法。

设计模式

装饰器模式

装饰器模式主要解决继承关系过于复杂的问题,通过组合来代替继承,给原始类添加增强功能,这也是判断装饰器的一个重要依据,除此之外,装饰器还有一个特点,可以对原始类嵌套使用多个装饰器,为了满足这样的需求,在设计的时候,装饰器类需要跟原始继承同步的抽象类或者接口。

Java IO 通过4个基类,扩展出很多子类, 具体如下:

装饰器模式相对于简单的组合关系,有如下特殊点:

  • 装饰器类和原始类继承相同的父类,我们可以对原始类嵌套多个装饰器类。
  • 装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点。

应用场景

  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 需要动态地给一个对象增加功能,这些功能也可以动态地被撤销。 当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。

代码

package decorator

type Component interface {
 Calc() int
}

type ConcreteComponent struct{}

func (*ConcreteComponent) Calc() int {
 return 0
}

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
}

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
}

测试用例

package decorator

import (
 "fmt"
 "testing"
)

func TestExampleDecorator(t *testing.T) {
 var c Component = &ConcreteComponent{}
 c = WarpAddDecorator(c, 10)
 c = WarpMulDecorator(c, 8)
 res := c.Calc()

 fmt.Printf("res %d\n", res)
 // Output:
 // res 80
}

运行结果

=== RUN   TestExampleDecorator
res 80
--- PASS: TestExampleDecorator (0.00s)
PASS

参考资料

  • https://github.com/senghoo/golang-design-pattern
  • https://tech.meituan.com/2020/03/19/design-pattern-practice-in-marketing.html
  • https://juejin.cn/post/6844903861908406280
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员奇点 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设计模式
  • 装饰器模式
  • 应用场景
  • 代码
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档