专栏首页程序员财富自由之路Go 设计模式- 装饰器模式

Go 设计模式- 装饰器模式

装饰模式使用对象组合的方式动态改变或增加对象行为。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

本文分享自微信公众号 - 程序员财富自由之路(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式-装饰器模式

    现代人每个人基本都会有一部手机,有的有好几部,正常情况下买手机有很多套餐,比如裸机、裸机+贴膜、裸机+贴膜+手机壳等,但是不一定每个人在购买的时候都一定会贴膜,...

    逍遥壮士
  • 设计模式-装饰器模式

    现在有一个场景:煎饼果子,科技园上班族早上去买煎饼果子(Pancake),有的人要加鸡蛋 (Egg)、有的人加火腿 (Ham)、有的人加生菜 (Lettuce)...

    码哥字节
  • 设计模式之装饰器设计模式

    Java的IO流使用了一种装饰器设计模式。它将IO流分成底层节点流和上层处理流,其中节点流用于和底层的物流存储结点直接关联——不同的物流节点获取该结点流的方式可...

    二十三年蝉
  • 设计模式之 装饰器模式

    tanoak
  • 设计模式之装饰器模式

    在日常生活中,装饰器模式的场景更多是的打扮了,一个妹子,嫌弃自己的脸长得不够漂亮,想换张脸很困难,但是化化妆还是很容易的(当然了,化妆也分男女的,此处指的是女士...

    Edison.Ma
  • PHP设计模式——装饰器模式

    咖啡深受人们的喜爱。咖啡的香气、味道和能力增强足以开启人们美好的一天。这就难怪为什么星巴克和咖啡豆这样的咖啡店在生意上可以做得这么好。

    Lemon黄
  • 设计模式之装饰器模式

    Attach additional responsibilities to an object dynamically keeping the same int...

    beginor
  • 【php设计模式】装饰器模式

    装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:

    码缘
  • 设计模式 | 装饰模式

    在不修改原有对象的基础上, 将功能附加到对象上。符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。

    憧憬博客
  • 设计模式~装饰模式

    3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。

    Vincent-yuan
  • 设计模式-装饰模式

    cwl_java
  • JavaScript设计模式之装饰器模式

    手机壳就是装饰器,没有它手机也能正常使用,原有的功能不变,手机壳可以减轻手机滑落的损耗。

    FinGet
  • Java设计模式(六)装饰器模式

    在学装饰器模式的时候,我想到了责任链模式中的级别这个概念,为什么这么说,在一个OA系统中我们会有不同级别(或者说权限范围不同)的管理员,首先我们要明确不同级别的...

    每天学Java
  • 设计模式—— 十七:装饰器模式

    ● Component(抽象构件) 抽象构件它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法。

    三分恶
  • Java 设计模式(五)《装饰器模式》

    这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

    星尘的一个朋友
  • 设计模式- 装饰器模式(Decorator Pattern)

    允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的...

    易兒善
  • PHP设计模式之装饰器模式

    工厂模式告一段落,我们来研究其他一些模式。不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟。其实,今天的装饰器模式就和化妆这件事很像。相信如果有程序媛M...

    硬核项目经理
  • dart设计模式之装饰器模式

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包...

    Weaster
  • 设计模式(五)——装饰器

    在装饰模式中, 必然有一个最基本、 最核心、 最原始的接口或抽象类充当 Component抽象构件。

    小森啦啦啦

扫码关注云+社区

领取腾讯云代金券