当前位置: 首页 > news >正文

安卓常见设计模式------装饰器模式(Kotlin版)

1. W1 是什么,什么是装饰器模式?

  1. 思想:动态地给对象添加额外的功能,通过将对象包装在一个装饰器类中,使装饰器类在不改变原始对象结构的情况下,扩展其功能。

2. W2 为什么,为什么需要使用装饰器模式,使用装饰器模式能给我们编码带来什么好处?

  1. 扩展功能: 装饰者模式允许在运行时动态地添加或修改对象的功能。这样就可以通过添加装饰器来扩展一个对象的功能,而无需修改原始对象的代码。这种灵活性使得在不改变现有代码的情况下,可以方便地添加新的功能或修改现有功能。

  2. 遵循开闭原则: 装饰者模式支持开闭原则,即对扩展开放,对修改关闭。通过使用装饰者模式,可以在不修改现有代码的情况下,通过添加新的装饰器来扩展对象的功能。这样就可以减少对原始对象的修改,提高代码的稳定性和可维护性。

  3. 代码复用性: 装饰者模式可以促进代码的复用。你可以将不同的装饰器组合在一起,以创建不同的功能组合。这样可以避免创建大量重复的子类或复制粘贴代码的情况,从而提高代码的可复用性。

  4. 细粒度控制: 装饰者模式允许以细粒度的方式控制对象的功能。通过添加不同的装饰器,你可以选择性地启用或禁用特定的功能,或按需组合功能。这样可以根据具体需求灵活地定制对象的行为。

  5. 透明性: 使用装饰者模式可以保持对象接口的一致性。装饰器和原始对象实现相同的接口,这使得装饰后的对象可以透明地替代原始对象,而不会破坏现有的代码结构。这种透明性使得客户端代码无需关心对象是否被装饰,从而简化了代码的使用和维护。

3. W3,如何使用?

  1. 在装饰者模式中,有一个抽象组件(Component)作为基础类,定义了对象的基本行为。然后,有一个具体组件(ConcreteComponent)实现了抽象组件,并提供了基本行为的具体实现。

  2. 除了抽象组件和具体组件外,还有一个装饰器(Decorator)类,它实现了抽象组件的接口,并持有一个抽象组件的引用。装饰器类可以在运行时动态地添加额外的功能或修改原始组件的行为。

  3. 下面是装饰者模式的主要参与者:

    Component(抽象组件):定义了对象的基本行为,可以是接口或抽象类。

    ConcreteComponent(具体组件):实现了抽象组件,并提供了基本行为的具体实现。

    Decorator(装饰器):持有一个抽象组件的引用,并实现了抽象组件的接口。可以在运行时动态地添加额外的功能。

    ConcreteDecorator(具体装饰器):扩展了装饰器类,添加了具体的功能或修改了原始组件的行为。

  4. 装饰者模式的核心思想是通过组合而不是继承来实现对象的功能扩展。它使得可以在运行时动态地添加、移除或修改对象的行为,而无需修改现有代码。

  5. 下面是代码示例:

// 定义一个基本的文本显示接口
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 是什么&#xff0c;什么是装饰器模式&#xff1f; 思想&#xff1a;动态地给对象添加额外的功能&#xff0c;通过将对象包装在一个装饰器类中&#xff0c;使装饰器类在不改变原始对象结构的情况下&#xff0c;扩展其功能。 2. W2 为什么&#xff0c;为什么需要使用装饰…...

将网站上的点击作为转化操作进行跟踪-官方指导文档

您可以使用转化跟踪功能&#xff0c;在用户点击您网站上的某个按钮或链接时进行跟踪。例如&#xff0c;您可以在用户点击“立即购买”按钮或点击您移动网站上的电话号码时进行跟踪。 本文介绍如何添加和修改转化跟踪代码&#xff0c;以便跟踪客户在您网站上的点击操作。如果希…...

Go相关命令说明

目录 Go相关命令说明go mod tidy &#xff1a;清理未使用依赖项&#xff0c;并更新模块文件主要功能好处 go clean -modcache &#xff1a;清除模块缓存go clean -testcache &#xff1a;清除测试缓存go test -v ./client &#xff1a;测试当前目录下client目录中的所有测试函数…...

3D全景技术,为我们打开全新宣传领域

随着科技的发展&#xff0c;3D全景技术正在融入我们的生活&#xff0c;这种全新视觉体验方式为我们打开了一扇全新的宣传领域&#xff0c;可以让我们多方位、多视角地探索各个行业&#xff0c;无论是对教育、商业、还是其他领域&#xff0c;都产生了深远的影响。 3D全景技术结合…...

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割10(测试推理篇)

对于直接将裁剪的patch,一个个的放到训练好的模型中进行预测,这部分代码可以直接参考前面的训练部分就行了。其实说白了,就是验证部分。不使用dataloader的方法,也只需要修改少部分代码即可。 但是,这种方法是不end to end的。我们接下来要做的,就是将一个CT数组作为输入…...

PyCharm+Miniconda3安装配置教程

PyCharm是Python著名的Python集成开发环境&#xff08;IDE&#xff09; conda有Miniconda和Anaconda&#xff0c;前者应该是类似最小化版本&#xff0c;后者可能是功能更为强大的版本&#xff0c;我们这里安装Miniconda 按官方文档的说法conda相当于pip与virtualenv的结合&am…...

【慢SQL性能优化】 一条SQL的生命周期 | 京东物流技术团队

一、 一条简单SQL在MySQL执行过程 一张简单的图说明下&#xff0c;MySQL架构有哪些组件和组建间关系&#xff0c;接下来给大家用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主题样式&#xff0…...

Docker两个容器互相请求接口

BEGIN 环境&#xff1a;Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络&#xff0c;包括其ID、名称、驱动以及作用范围 在 Docker 中&#xff0c;容器通过 Docker 网络进行相互通信&#xff1b;在 Docker 中有…...

UML与PlantUML简介

UML与PlantUML 1、UML与PlantUML概述2、PlantUML使用 1、UML与PlantUML概述 UML&#xff08;Unified Modeling Language&#xff09;是一种统一建模语言&#xff0c;为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言&#xff0c;独立于任何具体程序设计语言…...

面试--springboot基础

1、约定优于配置&#xff0c;理解 是一种软件设计的范式&#xff0c;减少开发人员对于配置项的维护&#xff0c;更加聚焦在业务逻辑上 基于spring框架开发web项目&#xff0c;只需要做一次配置 springboot starter启动依赖&#xff0c;帮我们管理jar包版本 当前应用依赖spring…...

“高端化”围城中,方太集团茅忠群的理想与现实

撰稿|行星 来源|贝多财经 “成为一家伟大的企业”&#xff0c;这是深耕厨电领域27年的方太集团&#xff08;下称“方太”&#xff09;矢志不渝的宏伟愿景。 在历经厨电行业十余年的高速发展期后&#xff0c;面临市场热度渐退、赛道高手林立的局面&#xff0c;在行业逆流中坚…...

Linux文件管理知识:文本处理

上篇文章详细介绍了Linux系统中查找文件的工具或者命令程序的相关操作内容介绍。那么&#xff0c;今天呢&#xff0c;这篇文章围绕Linux系统中文本处理来阐述。 众所周知&#xff0c;所有Linux操作系统都离不开一个核心原则&#xff0c;那就是它是由很多种文件组成的&#xff0…...

flink的带状态的RichFlatMapFunction函数使用

背景 使用RichFlatMapFunction可以带状态来决定如何对数据流进行转换&#xff0c;而且这种用法非常常见&#xff0c;根据之前遇到过的某个key的状态来决定再次遇到同样的key时要如何进行数据转换&#xff0c;本文就来简单举个例子说明下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内存中的数据以某种形式保存到磁盘上&#xff0c;以保证在Redis重启后数据不会丢失。Redis支持两种持久化方式&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。 RDB持久…...

第四章 :Spring Boot 配置文件指南

第四章 :Spring Boot 配置文件 前言 本章知识重点:作者结合开发实际经验与应用场景结合,整理了5种获取配置属性的方式。配置文件中获取属性应该是SpringBoot开发中最为常用的功能之一,但是常用的功能,仍然有很多开发者在这个方面踩坑。通过本章节学习在实际中避免一些坑,…...

常用中间件分类

常见的中间件包括&#xff1a; 消息中间件&#xff1a;用于处理应用程序之间的异步消息传递&#xff0c;常见的消息中间件包括 RabbitMQ、Apache Kafka、ActiveMQ 等。 缓存中间件&#xff1a;用于缓存数据以加快访问速度&#xff0c;常见的缓存中间件包括 Redis、Memcached 等…...

中文编程软件视频推荐,自学编程电脑推荐,中文编程开发语言工具下载

中文编程软件视频推荐&#xff0c;自学编程电脑推荐&#xff0c;中文编程开发语言工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件…...

Spring Boot 启动加速

一、简介 本文将带你了解如何通过调整 Spring 应用的配置、JVM 参数和使用 GraalVM 原生镜像来缩短 Spring Boot 的启动时间。 二、调整 Spring 应用 首先&#xff0c;创建一个 Spring Boot&#xff08;2.5.4&#xff09;应用&#xff0c;添加 Spring Web、Spring Actuator …...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...