模式定义

动态(组合)地给一个对象增加一些额外的职责,就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码并且减少子类个数)

类图

应用场景

扩展一个类的功能或给一个类添加附加职责

优点

1.符合开闭原则

2.不改变原有对象的情况下给一个对象扩展功能

3.使用不同的组合可以实现不同的效果

要点总结

  • 通过采用组合而非继承的手法,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”
  • Decorator类在接口上表现为is-a 的继承关系,即Decorator类继承了Component类所具有的接口,但在实现上又表现为has-a的组合关系,即Decorator类又使用了另外一个Component类
  • Decorator模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个问题方向上的扩展功能”–是为“装饰”的含义

Go语言代码实现

工程目录

Decorator.go

package Decoratorimport "fmt"//定义一个抽象组件
type Component interface {Operate()
}//实现一个具体的组件:组件1
type Compontent1 struct {}func (c1 *Compontent1) Operate() {fmt.Println("c1 operate")
}//定义一个抽象的装饰者
type Decorator interface {ComponentDo() //这是一个额外的方法
}//实现一个具体的装饰者
type Decorator1 struct {c Component
}func (d1 *Decorator1) Do() {fmt.Println("发生了装饰行为")
}func (d1 *Decorator1) Operate() {d1.Do()d1.c.Operate()
}

Decorator_test.go

package Decoratorimport "testing"func TestCompontent1_Operate(t *testing.T) {c1 := &Compontent1{}c1.Operate()
}func TestDecorator1_Operate(t *testing.T) {d1 := &Decorator1{}c1 := &Compontent1{}d1.c = c1d1.Operate()
}

设计模式--装饰者(Decorator)模式相关推荐

  1. android 装饰着模式,Android与设计模式——装饰者(Decorator)模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  2. 设计模式C++实现--Decorator模式

    2019独角兽企业重金招聘Python工程师标准>>> 装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设 ...

  3. 装饰者(Decorator)模式

    装饰者模式的说明 装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的设计方案. 装饰者模式的特点 装饰者和被装饰对象有相同的超类型: 可以用一个或多个装饰者包装一个对象: ...

  4. 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)

    [笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...

  5. 设计模式-Decorator模式(装饰者模式)

    文章目录 装饰者模式 代码实现 为什么使用装饰者模式 装饰者模式 假如现在有一块蛋糕, 加上奶油就是奶油蛋糕.如果继续再加上草莓,就是草莓蛋糕,再加点蜡烛,就变成了生日蛋糕.不论是蛋糕.奶油蛋糕.草莓 ...

  6. Decorator(装饰器) 模式

    12.1 Decorator 模式   假如有一块蛋糕,如果只涂上奶油,其他什么也不加,就是奶油蛋糕.如果加上草莓,就是草莓奶油蛋糕.如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上蜡烛 ...

  7. 设计模式的征途—10.装饰(Decorator)模式

    虽然目前房价依旧很高,就连我所在的成都郊区(非中心城区)的房价均价都早已破万,但却还是阻挡不了大家对新房的渴望和买房的热情.如果大家买的是清水房,那么无疑还有一项艰巨的任务在等着大家,那就是装修.对新 ...

  8. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  9. 设计模式:装饰(Decorator)模式

    设计模式之装饰(Decorator)模式 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修.相片加相框等.在软件开发过程中,有时想用一些现存的组件.这些组件可能只是完成了一些核心功 ...

最新文章

  1. Docker是世界上最牛逼的CaaS!
  2. 人均年薪250万, 拥有400名博士, 这家AI公司去年亏27亿
  3. 用C#使用HttpWebRequest Post数据时如何保持Session
  4. 网络加速和优化控制常用管理
  5. 如何用 C++ 在 10 行内写出八皇后?
  6. 转行,转向哪里?电子工程师!!!
  7. 现代制造工程课堂笔记06-集成电路制造工程
  8. linux开发板显示横向彩虹,给 Linux 终端的输出添加彩虹特效的命令
  9. AD19实时高亮显示网络,当鼠标悬停在网络上时能自动高亮
  10. javascript 经常会用到的东西
  11. Docker 镜像优化:减小镜像尺寸
  12. 11.PHP memcache 与 memcached 区别
  13. 什么情况下document.write会覆盖页面及覆盖原理解释
  14. 分布式系统的发展历程
  15. boder-radius四个值的问题,boder-radius超出四个值的问题
  16. VFB组件:VEH控件(异常)
  17. mapbox-gl添加threejs飞线
  18. 论文复现:<Beyond Static Features for Temporally Consistent 3D Human Pose and Shape from a Video>
  19. HTML与CSS学习总结
  20. Linux学习笔记(二十三) -- QT的安装和卸载

热门文章

  1. 二阶矩阵转置怎么求_矩阵求导术(下)
  2. 用PB从ORACLE导出DBF文件,PB导出规定格式DBF文件
  3. java 服务器发布_我如何在java中发布到服务器?
  4. 特变电工新能源打造绿色数据中心:综合能效提升18%以上
  5. 京东数科宣布机房巡检AI机器人落地金融机构数据中心
  6. mt7601u linux驱动下载,Ubuntu16.04安装DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
  7. SLAM:VSLAM简介之详细攻略
  8. 成功解决AttributeError: module tensorflow has no attribute random_normal
  9. CV之FR:DIY脚本通过人脸图像得到人脸特征向量并输出多张人脸图片之两两图片之间的距离
  10. TF之CNN:Tensorflow构建卷积神经网络CNN的简介、使用方法、应用之详细攻略