安卓常见设计模式------装饰器模式(Kotlin版)
1. W1 是什么,什么是装饰器模式?
- 思想:动态地给对象添加额外的功能,通过将对象包装在一个装饰器类中,使装饰器类在不改变原始对象结构的情况下,扩展其功能。
2. W2 为什么,为什么需要使用装饰器模式,使用装饰器模式能给我们编码带来什么好处?
-
扩展功能: 装饰者模式允许在运行时动态地添加或修改对象的功能。这样就可以通过添加装饰器来扩展一个对象的功能,而无需修改原始对象的代码。这种灵活性使得在不改变现有代码的情况下,可以方便地添加新的功能或修改现有功能。
-
遵循开闭原则: 装饰者模式支持开闭原则,即对扩展开放,对修改关闭。通过使用装饰者模式,可以在不修改现有代码的情况下,通过添加新的装饰器来扩展对象的功能。这样就可以减少对原始对象的修改,提高代码的稳定性和可维护性。
-
代码复用性: 装饰者模式可以促进代码的复用。你可以将不同的装饰器组合在一起,以创建不同的功能组合。这样可以避免创建大量重复的子类或复制粘贴代码的情况,从而提高代码的可复用性。
-
细粒度控制: 装饰者模式允许以细粒度的方式控制对象的功能。通过添加不同的装饰器,你可以选择性地启用或禁用特定的功能,或按需组合功能。这样可以根据具体需求灵活地定制对象的行为。
-
透明性: 使用装饰者模式可以保持对象接口的一致性。装饰器和原始对象实现相同的接口,这使得装饰后的对象可以透明地替代原始对象,而不会破坏现有的代码结构。这种透明性使得客户端代码无需关心对象是否被装饰,从而简化了代码的使用和维护。
3. W3,如何使用?
-
在装饰者模式中,有一个抽象组件(Component)作为基础类,定义了对象的基本行为。然后,有一个具体组件(ConcreteComponent)实现了抽象组件,并提供了基本行为的具体实现。
-
除了抽象组件和具体组件外,还有一个装饰器(Decorator)类,它实现了抽象组件的接口,并持有一个抽象组件的引用。装饰器类可以在运行时动态地添加额外的功能或修改原始组件的行为。
-
下面是装饰者模式的主要参与者:
Component(抽象组件):定义了对象的基本行为,可以是接口或抽象类。
ConcreteComponent(具体组件):实现了抽象组件,并提供了基本行为的具体实现。
Decorator(装饰器):持有一个抽象组件的引用,并实现了抽象组件的接口。可以在运行时动态地添加额外的功能。
ConcreteDecorator(具体装饰器):扩展了装饰器类,添加了具体的功能或修改了原始组件的行为。
-
装饰者模式的核心思想是通过组合而不是继承来实现对象的功能扩展。它使得可以在运行时动态地添加、移除或修改对象的行为,而无需修改现有代码。
-
下面是代码示例:
// 定义一个基本的文本显示接口
interface TextDisplay {fun displayText(): String
}// 实现基本的文本显示类
class SimpleTextDisplay(private val text: String) : TextDisplay {override fun displayText(): String {return text}
}// 定义装饰器接口
interface TextDecorator : TextDisplay// 实现具体的装饰器类1 加粗
class BoldTextDecorator(private val textDisplay: TextDisplay) : TextDecorator {override fun displayText(): String {val text = textDisplay.displayText()return "<b>$text</b>"}
}// 实现具体的装饰器类2 斜体
class ItalicTextDecorator(private val textDisplay: TextDisplay) : TextDecorator {override fun displayText(): String {val text = textDisplay.displayText()return "<i>$text</i>"}
}// 使用示例
val originalText = "Hello, World!"
val simpleDisplay: TextDisplay = SimpleTextDisplay(originalText)// 添加装饰器来修饰文本
val boldTextDisplay: TextDisplay = BoldTextDecorator(simpleDisplay)
val italicTextDisplay: TextDisplay = ItalicTextDecorator(simpleDisplay)// 输出修饰后的文本
println(boldTextDisplay.displayText()) // 输出: <b>Hello, World!</b>
println(italicTextDisplay.displayText()) // 输出: <i>Hello, World!</i>
Thank you for your reading, have a nice day!
相关文章:
安卓常见设计模式------装饰器模式(Kotlin版)
1. W1 是什么,什么是装饰器模式? 思想:动态地给对象添加额外的功能,通过将对象包装在一个装饰器类中,使装饰器类在不改变原始对象结构的情况下,扩展其功能。 2. W2 为什么,为什么需要使用装饰…...
将网站上的点击作为转化操作进行跟踪-官方指导文档
您可以使用转化跟踪功能,在用户点击您网站上的某个按钮或链接时进行跟踪。例如,您可以在用户点击“立即购买”按钮或点击您移动网站上的电话号码时进行跟踪。 本文介绍如何添加和修改转化跟踪代码,以便跟踪客户在您网站上的点击操作。如果希…...
Go相关命令说明
目录 Go相关命令说明go mod tidy :清理未使用依赖项,并更新模块文件主要功能好处 go clean -modcache :清除模块缓存go clean -testcache :清除测试缓存go test -v ./client :测试当前目录下client目录中的所有测试函数…...
3D全景技术,为我们打开全新宣传领域
随着科技的发展,3D全景技术正在融入我们的生活,这种全新视觉体验方式为我们打开了一扇全新的宣传领域,可以让我们多方位、多视角地探索各个行业,无论是对教育、商业、还是其他领域,都产生了深远的影响。 3D全景技术结合…...
【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割10(测试推理篇)
对于直接将裁剪的patch,一个个的放到训练好的模型中进行预测,这部分代码可以直接参考前面的训练部分就行了。其实说白了,就是验证部分。不使用dataloader的方法,也只需要修改少部分代码即可。 但是,这种方法是不end to end的。我们接下来要做的,就是将一个CT数组作为输入…...
PyCharm+Miniconda3安装配置教程
PyCharm是Python著名的Python集成开发环境(IDE) conda有Miniconda和Anaconda,前者应该是类似最小化版本,后者可能是功能更为强大的版本,我们这里安装Miniconda 按官方文档的说法conda相当于pip与virtualenv的结合&am…...
【慢SQL性能优化】 一条SQL的生命周期 | 京东物流技术团队
一、 一条简单SQL在MySQL执行过程 一张简单的图说明下,MySQL架构有哪些组件和组建间关系,接下来给大家用SQL语句分析 例如如下SQL语句 SELECT department_id FROM employee WHERE name Lucy AND age > 18 GROUP BY department_id其中name为索引&a…...
小程序day05
使用npm包 Vant Weapp 类似于前端boostrap和element ui那些的样式框架。 安装过程 注意:这里建议直接去看官网的安装过程。 vant-weapp版本最好也不要指定 在项目目录里面先输入npm init -y 初始化一个包管理配置文件: package.json 使用css变量定制vant主题样式࿰…...
Docker两个容器互相请求接口
BEGIN 环境:Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络,包括其ID、名称、驱动以及作用范围 在 Docker 中,容器通过 Docker 网络进行相互通信;在 Docker 中有…...
UML与PlantUML简介
UML与PlantUML 1、UML与PlantUML概述2、PlantUML使用 1、UML与PlantUML概述 UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言,独立于任何具体程序设计语言…...
面试--springboot基础
1、约定优于配置,理解 是一种软件设计的范式,减少开发人员对于配置项的维护,更加聚焦在业务逻辑上 基于spring框架开发web项目,只需要做一次配置 springboot starter启动依赖,帮我们管理jar包版本 当前应用依赖spring…...
“高端化”围城中,方太集团茅忠群的理想与现实
撰稿|行星 来源|贝多财经 “成为一家伟大的企业”,这是深耕厨电领域27年的方太集团(下称“方太”)矢志不渝的宏伟愿景。 在历经厨电行业十余年的高速发展期后,面临市场热度渐退、赛道高手林立的局面,在行业逆流中坚…...
Linux文件管理知识:文本处理
上篇文章详细介绍了Linux系统中查找文件的工具或者命令程序的相关操作内容介绍。那么,今天呢,这篇文章围绕Linux系统中文本处理来阐述。 众所周知,所有Linux操作系统都离不开一个核心原则,那就是它是由很多种文件组成的࿰…...
flink的带状态的RichFlatMapFunction函数使用
背景 使用RichFlatMapFunction可以带状态来决定如何对数据流进行转换,而且这种用法非常常见,根据之前遇到过的某个key的状态来决定再次遇到同样的key时要如何进行数据转换,本文就来简单举个例子说明下RichFlatMapFunction的使用方法 RichFl…...
MySQL的安装使用(入学篇)
目录 1 MySQL安装 1.1 安装epel源 1.2 安装MySQL Repository 1.3 安装MySQL官方yum源 1.4 安装服务端、客户端 1.5 启动MySQL服务 2 MySQL 使用 2.1 获取初始登录密码 2.2 登录MySQL数据库 2.3 修改密码 2.4 退出数据库 2.5 使用新密码登录数据库 2.6 重启数据库 2.7 创建数据…...
面试复习整理
redis持久化方式和原理 Redis持久化是指将Redis内存中的数据以某种形式保存到磁盘上,以保证在Redis重启后数据不会丢失。Redis支持两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。 RDB持久…...
第四章 :Spring Boot 配置文件指南
第四章 :Spring Boot 配置文件 前言 本章知识重点:作者结合开发实际经验与应用场景结合,整理了5种获取配置属性的方式。配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但是常用的功能,仍然有很多开发者在这个方面踩坑。通过本章节学习在实际中避免一些坑,…...
常用中间件分类
常见的中间件包括: 消息中间件:用于处理应用程序之间的异步消息传递,常见的消息中间件包括 RabbitMQ、Apache Kafka、ActiveMQ 等。 缓存中间件:用于缓存数据以加快访问速度,常见的缓存中间件包括 Redis、Memcached 等…...
中文编程软件视频推荐,自学编程电脑推荐,中文编程开发语言工具下载
中文编程软件视频推荐,自学编程电脑推荐,中文编程开发语言工具下载 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件…...
Spring Boot 启动加速
一、简介 本文将带你了解如何通过调整 Spring 应用的配置、JVM 参数和使用 GraalVM 原生镜像来缩短 Spring Boot 的启动时间。 二、调整 Spring 应用 首先,创建一个 Spring Boot(2.5.4)应用,添加 Spring Web、Spring Actuator …...
如何在5分钟内免费搭建OBS RTSP服务器:完整配置指南
如何在5分钟内免费搭建OBS RTSP服务器:完整配置指南 【免费下载链接】obs-rtspserver RTSP server plugin for obs-studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-rtspserver 你是否想过将OBS Studio的专业直播内容直接推送到监控系统、智能电视或…...
Phi-4-mini-reasoning轻量模型部署成本分析:单卡月均电费与推理QPS性价比
Phi-4-mini-reasoning轻量模型部署成本分析:单卡月均电费与推理QPS性价比 1. 模型概述 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它经过专门微调以提升…...
揭秘3140亿参数Grok-1:马斯克AI巨兽的多语言能力技术突破
揭秘3140亿参数Grok-1:马斯克AI巨兽的多语言能力技术突破 【免费下载链接】grok-1 Grok open release 项目地址: https://gitcode.com/GitHub_Trending/gr/grok-1 Grok-1作为一款备受关注的开源AI模型,凭借其3140亿的惊人参数规模,在自…...
从0到1:企业级AI项目迭代日记 Vol.10|为什么团队都在忙,系统却越来越乱?
你有没有遇到过这种情况——团队里每个人都在推进,方向也都没错,但系统却越来越像一堆散件,而不是一台机器。这是企业级 AI 项目最典型的死法之一。今天我们开了一场会,专门聊怎么防止这件事发生。不是因为出了什么惊天动地的新功…...
OpenWrt 23.05版本解析:路由器与嵌入式系统升级
1. OpenWrt 23.05版本深度解析:从路由器到嵌入式系统的全面升级作为一名长期使用OpenWrt的网络工程师,每次新版本发布都像拆盲盒一样充满期待。这次23.05版本的更新幅度之大,让我不得不连夜刷机测试。这个专为路由器和资源受限设备打造的Linu…...
保姆级教程:在RK3588 Android12上配置CPU风扇温控,告别过热降频
RK3588 Android12风扇温控实战:从原理到调优的完整指南 当RK3588开发板在高负载运行时,你是否遇到过CPU温度飙升导致系统卡顿的情况?嵌入式开发者都知道,过热不仅影响性能,长期高温还会缩短硬件寿命。本文将带你深入理…...
【20年IDE生态专家实测】:Copilot Next 工作流配置面试通关路径图——含YAML Schema校验、权限沙箱、Telemetry埋点3大权威验证项
更多请点击: https://intelliparadigm.com 第一章:VS Code Copilot Next 自动化工作流配置面试全景概览 VS Code Copilot Next 并非独立产品,而是微软在 VS Code 1.90 版本中深度集成的 AI 编程增强套件,融合 GitHub Copilot Cha…...
ANI3DHUMAN:3D人体动画技术的自引导随机采样解析
1. ANI3DHUMAN:基于自引导随机采样的3D人体动画技术解析在数字内容创作领域,3D人体动画一直面临着逼真度与可控性难以兼得的困境。传统运动学方法能精确控制骨骼动作,却无法模拟衣物飘动等自然动态;而基于物理模拟的方案虽能呈现逼…...
拜读了顶会顶刊上这些论文,原来多模态特征融合是这么玩的
多模态特征融合现在确实比端到端好发,还能蹭一波大模型的热度,因此我最近翻了很多相关的论文,发现这块新活还真不少。简单来说,就是这方向现在不搞简单的拼接/注意力了,改卷动态路由、层次化交互、低秩分解、基于大模型…...
AI技能集成指南:从原理到实践,探索大模型与工作流融合
1. 项目概述与价值定位最近在GitHub上闲逛,又发现了一个宝藏仓库,叫rafsilva85/awesome-ai-skills。光看名字就很有意思,“awesome”系列大家都懂,是某个领域优质资源的精选合集,而“AI skills”直译是“AI技能”。点进…...
