安卓常见设计模式5------桥接模式(Kotlin版)
1. W1 是什么,什么是桥接模式?
-
桥接模式是一种结构性模式。
-
桥接模式旨在将抽象与实现解耦,使它们可以独立地变化。可以这么理解,面向对象编程是单继承多实现的,如果我们有一个可扩展类,和多个相关的可扩展维度的话,就可以创建一个抽象类来像桥梁一样连接这些个维度。
因此这里的抽象可以理解为有一个抽象类,实现就代表多个接口。而桥接模式就是在这个抽象类里放多个接口,结构不就清晰明了了哇。
2. W2 为什么,为什么需要使用桥接模式,能给我们编码带来什么好处?
-
解耦抽象与实现:桥接模式有助于将抽象部分与实现部分分离。通过将两者之间的连接通过桥接对象进行,可以使它们可以独立地变化。这种解耦使得系统更加灵活,更容易扩展和维护。
-
提高可扩展性:通过桥接模式,我们可以轻松添加新的抽象部分和实现部分,而不需要修改现有的代码。例如,在下面的怪物例子中,我们可以添加新的攻击方式或属性类,而不会影响现有的攻击方式和属性的组合。这种可扩展性使得系统更具弹性,能够适应变化的需求。
-
支持组合复用:桥接模式使得可以通过组合不同的抽象部分和实现部分来创建不同的组合对象。这种组合复用的方式使得系统更加灵活,可以根据需要构建不同的对象组合。
-
提高可维护性和可读性:通过将抽象和实现分离,桥接模式使得代码结构更清晰,易于理解和维护。每个部分都有自己的责任,而且它们之间的关系也更加明确。这种清晰性和可读性有助于减少错误和改进代码的可维护性。
3. W3,如何使用?下面是代码示例:
-
假设我们正在开发一个游戏,其中有不同类型的怪物(Monster)。每个怪物都有不同的攻击方式(AttackMode),比如近战攻击和远程攻击。同时,怪物还有不同的属性(Attribute),比如光属性和雷属性。
-
分析发现,这里的怪物可扩展,有不同类型,怪物的攻击方式也可扩展,有近战和远程,同时怪物还有不同的属性,也可扩展,那么这里就有3个可扩展的维度,我们选择其中的一个维度作为抽象类,其他的作为接口,用这个抽象类连接其他接口,这就是桥接模式了。
-
那选谁作为这个抽象类呢,选主体Monster是比较符合我们编程风格的。
代码示例:
// 首先,我们定义一个抽象类 Monster,它包含了怪物的基本属性和抽象方法
abstract class Monster {// 攻击方式protected lateinit var attackMode: AttackMode// 基本属性protected lateinit var attribute: Attributefun setAttackMode(attackMode: AttackMode) {this.attackMode = attackMode}fun setAttribute(attribute: Attribute) {this.attribute = attribute}abstract fun display()abstract fun attack()abstract fun defend()
}// 然后,我们定义接口 AttackMode, Attribute,其中包含了怪物攻击的方法以及怪物的属性:
interface AttackMode {fun attack()
}interface Attribute{fun display()
}// 接下来,我们创建不同类型的怪物,每个怪物都可以设置不同的攻击方式和展示不同的属性:
class MeleeMonster : Monster() {override fun display() {attribute.display()}override fun attack() {attackMode.attack()}override fun defend() {println("Defending as a melee monster")}
}class RangedMonster : Monster() {override fun display() {attribute.display()}override fun attack() {attackMode.attack()}override fun defend() {println("Defending as a ranged monster")}
}// 最后,我们实现具体的攻击方式,比如近战攻击和远程攻击,还要实现具体的属性,比如光属性,雷属性:class MeleeAttack : AttackMode {override fun attack() {println("Performing melee attack")}
}class RangedAttack : AttackMode {override fun attack() {println("Performing ranged attack")}
}class LightAttribute: Attribute {override fun display() {println("Show body protection light")}
}class ThunderAttribute: Attribute{override fun display() {println("Show body protection thunder")}
}// 现在,我们可以在应用程序中使用这些类来创建怪物,并设置它们的攻击方式和属性:
fun main() {val meleeMonster = MeleeMonster()meleeMonster.setAttackMode(MeleeAttack())meleeMonster.setAttribute(LightAttribute())meleeMonster.display()meleeMonster.attack()meleeMonster.defend()val rangedMonster = RangedMonster()rangedMonster.setAttackMode(RangedAttack())rangedMonster.setAttribute(ThunderAttribute())rangedMonster.display()rangedMonster.attack()rangedMonster.defend()
}
Thank you for your reading, best regards!
相关文章:
安卓常见设计模式5------桥接模式(Kotlin版)
1. W1 是什么,什么是桥接模式? 桥接模式是一种结构性模式。 桥接模式旨在将抽象与实现解耦,使它们可以独立地变化。可以这么理解,面向对象编程是单继承多实现的,如果我们有一个可扩展类,和多个相关的可扩展…...
tomcat web.xml文件中的session-config
<session-config>这个元素为该应用中创建的所有session定义默认超时时间,单位是分钟。这个值必须是整数。如果是0或者负数,表示不超时。如果该元素没有设置,容器设置一个默认值。 例如: <session-config><session…...

Hadoop知识点全面总结
文章目录 什么是HadoopHadoop发行版介绍Hadoop版本演变历史Hadoop3.x的细节优化Hadoop三大核心组件介绍HDFS体系结构NameNode介绍总结 SecondaryNameNode介绍DataNode介绍DataNode总结 MapReduce介绍分布式计算介绍MapReduce原理剖析MapReduce之Map阶段MapReduce之Reduce阶段 实…...

MSVCP140_CODECVT_IDS.dll丢失怎么办?推荐三个解决方法帮你解决
MSVCP140_CODECVT_IDS.dll是Microsoft Visual C 2015 Redistributable的一个组件,它包含了一些运行时库文件。当您在运行某些程序时,可能会遇到“msvcp140_codecvt_ids.dll丢失”的错误提示。为了解决这个问题,您可以尝试以下三种方法&#x…...
问题描述:64位计算机的寻址能力是多少TB
问题描述:64位计算机的寻址能力是多少TB 我在看到一个32位电脑的寻址能力计算时,看到是这么计算的。 虚拟内存的大小受到计算机地址位数的限制, 那么32位电脑的寻址能力计算应该是这样 为什么网上百度到的是16TB呢,如下图所示 中…...

【算法 | 数论 No.1】AcWing1246. 等差数列
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【AcWing算法提高学习专栏】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程&a…...

竞赛 目标检测-行人车辆检测流量计数
文章目录 前言1\. 目标检测概况1.1 什么是目标检测?1.2 发展阶段 2\. 行人检测2.1 行人检测简介2.2 行人检测技术难点2.3 行人检测实现效果2.4 关键代码-训练过程 最后 前言 🔥 优质竞赛项目系列,今天要分享的是 行人车辆目标检测计数系统 …...

秋招进入尾声了,还有哪些公司和岗位可以投递?
24届秋招基本已经进入尾声了,接下来就是秋招补录了,最近在微信群看到一些同学再问哪些公司还在招人的。 在这里跟大家分享一份2024届秋招信息汇总表,目前已更新2000家,不仅有互联网公司,还有外企、国企、各类研究所&am…...

CSS 文字溢出省略号显示
1. 单行文本溢出显示省略号 需要满足三个条件,添加对应的代码: (1)先强制一行内显示文本; (2)超出的部分隐藏; (3)文字用省略号来替代省略的部分…...
POD创建与删除简单描述
创建一个 Pod 的过程可以分为以下几个步骤: 用户使用 kubectl create 命令或 YAML 文件向 API 服务器发送创建 Pod 的请求。API 服务器将请求转换为 Kubernetes 的内部对象,并将 Pod 的状态设置为 Pending。调度器根据 Pod 的资源需求和节点的资源情况&…...
AndroidStudio打包报错记录(commons-logging,keystore password was incorrect)
场景: AndroidStudio2022打包APK的时报错 1.commons-logging依赖冲突 报错主要信息如下 Error: commons-logging defines classes that conflict with classes now provided by Android. 通过报错信息可以看出,项目中的commons-logging与Android系统自带…...
如何构建企业数据资产?数据资产如何入资产负债表 ?
一、构建企业数据资产 1. 数据收集 需要从多渠道收集数据,包括企业内部系统、市场调研、社交媒体、客户反馈等。在收集数据时,需要注意数据的真实性、完整性和可靠性。同时,需要考虑如何将不同渠道的数据进行整合和标准化,以便后…...

代码随想录算法训练营Day 47 || 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
198.打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系…...

(论文阅读24/100)Visual Tracking with Fully Convolutional Networks
文献阅读笔记(sel - CNN) 简介 题目 Visual Tracking with Fully Convolutional Networks 作者 Lijun Wang, Wanli Ouyang, Xiaogang Wang, and Huchuan Lu 原文链接 http://202.118.75.4/lu/Paper/ICCV2015/iccv15_lijun.pdf 【DeepLearning】…...
第10章 文件和异常
目录 1. 从文件中读取数据1.1 读取整个文件1.2 逐行读取1.3 创建一个包含文件各行内容的列表 2. 写入文件2.1 写入空文件2.2 写入多行2.3 附加到文件 3. 异常使用try-except-else代码块 4. 存储数据使用json.dump()和json.load() 1. 从文件中读取数据 1.1 读取整个文件 with …...

【云栖2023】张治国:MaxCompute架构升级及开放性解读
简介: 本文根据2023云栖大会演讲实录整理而成,演讲信息如下 演讲人:张治国|阿里云智能计算平台研究员、阿里云MaxCompute负责人 演讲主题:MaxCompute架构升级及开放性解读 活动:2023云栖大会 MaxCompute发展经历了…...

【经验模态分解】4.信号由时域向频域的转换
/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file 傅里叶变换与小波变换* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian(黑曜石笔记软件&#…...
STM32的M4内核在keil上面float访问就hard_fault原因
使用 Keil MDK(Microcontroller Development Kit)开发时,出现硬件故障(hard fault)通常是由于访问浮点数(float)数据类型时,浮点单元配置不正确或浮点单元启用导致的。以下是一些可能…...
【LeetCode】217. 存在重复元素
217. 存在重复元素 难度:简单 题目 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出࿱…...

【Redis缓存架构实战常见问题剖析】
文章目录 一、Redis缓存架构实战剖析1.1、大规模的商品缓存数据冷热分离机制1.2、缓存击穿导致线上数据压力暴增解决方案1.3、缓存穿透及其解决方案剖析1.4、突发性的热点缓存数重建导致系统压力暴增问题分析1.5、Redis分布式锁解决缓存与数据库双写不一致问题剖析1.6、利用多级…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...