Kotlin~Decorator装饰器模式

概念

装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。可以运行时动态添加新的功能,而无需改变原来的代码。
特点:

  • 灵活扩展新的功能
  • 动态添加额外职责

角色介绍

  • Component: 抽象组件,定义抽象规范
  • ConcreteComponent:具体子类,实现抽象构建声明的方法
  • Decorator:抽象装饰器,也是抽象构建类的子类,维护一个指向抽象构建类的引用,通过引用调用装饰之前构建对象的方法,并通过子类扩展方法,最终达到装饰的目的。
  • ConcreteDecorator:具体装饰器,继承抽象装饰器,可以调用抽象装饰器定义的方法也可以添加新的方法。

UML

装饰器

代码实现

kt中实现装饰器有两种方式
一,类委托
通过by关键字将装饰类的所有方法委托给一个被装饰的类对象,只需复写装饰的方法即可。

interface Coffee {val name: Stringfun cost(): Float
}class SimpleCoffee : Coffee {override val name: String = "咖啡"override fun cost(): Float = 6f
}abstract class CoffeeDecorator(protected val coffee: Coffee) : Coffee by coffee
class MilkDecorator(coffee: Coffee) : CoffeeDecorator(coffee) {override val name: String = "牛奶${coffee.name}"override fun cost(): Float {return coffee.cost() + 2}
}class SugarDecorator(coffee: Coffee) : CoffeeDecorator(coffee) {override val name: String = "多糖${coffee.name}"override fun cost(): Float {return coffee.cost() + 3}
}fun main() {val coffee: Coffee = SimpleCoffee()val coffeeWithMilk: Coffee = MilkDecorator(coffee)val coffeeWithMilkAndSugar: Coffee = SugarDecorator(coffeeWithMilk)println("${coffee.name} -> ${coffee.cost()}")println("${coffeeWithMilk.name} -> ${coffeeWithMilk.cost()}")println("${coffeeWithMilkAndSugar.name} -> ${coffeeWithMilkAndSugar.cost()}")
}

二,使用扩展函数
该方式只能新增新的方法,不能复写原有方法。且复写的方法只在相应的模块有效其他地方无效。

优缺点

优点

  • 提高灵活性和可扩展性
  • 简便不同的组合
  • 提高可维护性

缺点

  • 代码复杂性增加
  • 增加性能开销

应用场景

在不影响其他对象的情况下,为单个对象增加新功能,动态组合各种可选功能。

  • GUI可视化组件
  • 通信协议
  • 日志系统
  • 权限控制系统

总结

通过装饰器模式,我们可以复写行为、直接调用原有方法,还可以扩展行为。
相似模式对比:

模式目的模式主要角色应用场景
Builder生成器分布构建复杂对象指挥者,生成器构建具有复杂逻辑的对象
Composite组合表示具有层次结构的对象组合类和叶子节点树形结构和递归结构
Decorator装饰器动态添加新功能抽象组件和装饰器功能组合和扩展

参考:

  • Kotlin 设计模式-装饰器
  • 装饰器模式(Decorator Pattern)总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19445.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

buu-Reverse-[2019红帽杯]childRE

目录 [2019红帽杯]childRE 修饰函数名和函数签名是什么? 对于变换部分的具体分析: [2019红帽杯]childRE 下载附件,查壳,无壳 在IDA中打开,定位主函数 int __cdecl main(int argc, const char **argv, const char …

Kotlin~责任链模式

概念 允许多个对象按顺序处理请求或任务。 角色介绍 Handler: 处理器接口,提供设置后继者&#xff08;可选&#xff09;ConcreteHandler&#xff1a;具体处理器&#xff0c;处理请求 UML 代码实现 比如ATM机吐钱就可以使用责任链实现。 class PartialFunction<in P1, o…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 列式数据是如何存储与处理的

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

无聊猿惨遭亏本甩卖 “贵族”持有人沦为“大冤种

被称为NFT贵族的无聊猿&#xff08;BAYC&#xff09;正在进行挥泪大甩卖&#xff0c;歌手黄立成等持有者们近期不断抛售BAYC NFT&#xff0c;导致该系列NFT地板价一度跌至30 ETH&#xff08;约5.7万美元&#xff09;以下。 一年多以前&#xff0c;BAYC还是时尚界的宠儿&#x…

JavaCV实现byte[]转RTMP流

需求&#xff1a;通过私有的api我可以不断收到byte[]形式的视频数据&#xff0c;现在我需要处理这些数据&#xff0c;最终推送出RTMP流。 实现&#xff1a;通过管道流将不断收到的byte[]视频数据转化为输入流然后提供给JavaCV的FFmpegFrameGrabber使用&#xff0c;然后通过FFmp…

96、基于STM32单片机的温湿度DHT11 烟雾火灾报警器蓝牙物联网APP远程控制设计(程序+原理图+任务书+参考论文+开题报告+流程图+元器件清单等)

单片机及温湿度、烟雾传感器是烟雾报警器系统的两大核心。单片机好比一个桥梁&#xff0c;联系着传感器和报警电路设备。近几年来&#xff0c;单片机已逐步深入应用到工农业生产各部门及人们生活的各个方面。各种类型的单片机也根据社会的需求而开发出来。单片机是器件级计算机…

机器人xacro文件转换成urdf文件方法,并在rviz可视化

一、进入工作空间&#xff0c;source一下 cd cat_ws source devel/setup.bash二、进入xacro所在的文件夹&#xff0c;完成xacro文件到urdf文件的转换 cd src/kinova-ros/kinova_description/urdf/然后执行下面命令 rosrun xacro xacro.py two_arm_robot_example_standalone.…

华为路由器如何通过Console口进行基本配置

华为HCIA试听课程&#xff1a;不会传输层协议&#xff0c;HCIA都考不过https://mp.weixin.qq.com/s/oKAL8GvdrcHEb5O_8bEZZQ 思科CCNA试听课程&#xff1a;适合初学者&#xff1a;VLAN原理与配置https://mp.weixin.qq.com/s/toIJg1EVFImalrwzbTONTQ 组网图形 组网需求 通过Cons…

设计模式之责任链模式

文章目录 1、基本介绍2、包含角色3、场景推导4、责任链模式的优缺点5、使用场景 1、基本介绍 王二狗本来是干Android开发的&#xff0c;最近公司想让他把IOS的活也干了&#xff0c;但是Windows笔记本不能开发IOS&#xff0c;所以二狗提出买一台Mac笔记本电脑。这花钱的事需要领…

css animation 鼠标移入暂停会抖动

如图 实现一个赞助商横向滚动列表墙&#xff0c; 上下两排向右滚动&#xff0c;中间向左滚动&#xff0c;鼠标移入暂停当前行。 实现&#xff1a; // 使用animation.moving {animation: move 20s linear infinite; }keyframes move {0% {}100% {transform: translateX(-50%);…

node版本控制工具nvm使用笔记

由于不同的项目所需要的node环境不同&#xff0c;所以在运行支持node 12或者node 16版本的项目时卸载安装不同版本的node非常麻烦&#xff0c;恰巧公司有一个热心的同事告诉我可以使用nvm来进行版本控制&#xff0c;我使用了之后发现确实好用&#xff0c;写一篇笔记记录一下。 …

C#内存不够解决方法

今天在使用C#程序的时候&#xff0c;出现了下图的问题&#xff1a; 注意下图中我用红框标出的位置&#xff0c;实际是一个三维数组。 但是出现这个问题和三维数组没有关系。 他是提示内存不足。 百度了一下&#xff0c;C#在生成的过程中如果是生成对应的32位系统&#xff0c…