【Kotlin设计模式】Kotlin实现适配器模式

2024-08-27 09:36

本文主要是介绍【Kotlin设计模式】Kotlin实现适配器模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言


适配器模式(Adapter Pattern)的核心将某个类的接口转换成客户端期望的另一个接口表示,使得客户端能够通过自己期望的接口与不兼容的类进行交互。适配器模式有三种实现方式,分别是类适配器模式对象适配器模式接口适配器模式

我们假设有个视频输出盒子,当前只能接收和输出HDMI信号,现在客户的输入设备只能输出VGA信号,则我们可以通过转换器(要适配的类),将VGA信号转换成HDMI信号做输出。

在这里插入图片描述

在这里插入图片描述


实现


1、类适配器模式

客户目标接口,客户的新设备只能输出VGA信号,无法输出HDMI信号。


/*** 客户目标输入接口*/
interface SourceInput {fun inputVGA(signal:String)
}

Modem盒子只接收且输出HDMI信号,调制后输出给到显示设备进行显示。


/*** 要适配的类*/
open class ModemOutput {fun outputHDMI(signal:String){println("设备输出${signal}给显示设备")}
}

新的输入设备输出VGA模拟信号不满足现在的需求,我们通过定义转换器OutputAdapter,将VGA模拟信号转化成HDMI数字信号进行输出到Modem盒子中。


/*** 转换器*/
class OutputAdapter : ModemOutput(), SourceInput {override fun inputVGA(signal: String) {if ("VGA模拟信号" == signal) {println("【转HDMI信号转换器】>> 接收到了源设备,输入的${signal}")val digital = convertVGAToHDMI(signal)outputHDMI(digital)} else {throw IllegalArgumentException("输入信号错误")}}private fun convertVGAToHDMI(signal: String): String {println("【转HDMI信号转换器】>> 转化器将${signal}转化成HDMI数字信号")return "HDMI数字信号"}
}

客户端


val adapter = OutputAdapter() as SourceInput
adapter.inputVGA("VGA模拟信号")// 【转HDMI信号转换器】>> 接收到了源设备,输入的VGA模拟信号
// 【转HDMI信号转换器】>> VGA转HDMI转化器将VGA模拟信号转化成HDMI数字信号
//  设备输出HDMI数字信号给显示设备

适配器类需要继承ModemOutputJava是单继承模式,所以目标文件必须要是接口。


2、对象适配器模式

对象适配器模式较类适配器模式相比,原来的适配器不再继承要适配的类,将其作为适配器的构造参数传入,把继承解耦。


/*** 要适配的类*/
open class ModemOutput {fun outputHDMI(signal:String){println("设备输出${signal}给显示设备")}
}

/*** 目标接口*/
interface SourceInput {fun inputVGA(signal:String)
}
/*** 转换器*/
class OutputAdapter(output: ModemOutput) : SourceInput {private var mOutput:ModemOutput = outputoverride fun inputVGA(signal: String) {if ("VGA模拟信号" == signal) {println("【转HDMI信号转换器】>> 接收到了源设备,输入的${signal}")val digital = convertVGAToHDMI(analog)mOutput.outputHDMI(signal)} else {throw IllegalArgumentException("输入信号错误")}}private fun convertVGAToHDMI(signal: String): String {println("【转HDMI信号转换器】>> VGA转HDMI转化器将${signal}转化成HDMI数字信号")return "HDMI数字信号"}}

3、接口适配器模式

接口适配器模式适用于目标接口中有多个方法,上面我们举了个目标接口中输入VGA的例子,假如还有DP接口DVI接口的输入,适配器类在实现目标接口时候就要都实现其他的方法,但是客户端输入只有一种,不需要实现全部接口时,如果适配器定义抽象类来实现接口,并且接口中方法空实现,可以灵活解决这个问题。

目标接口新增格式信源输入方法,要适配的类不变。


/*** 目标接口*/
interface SourceInput {fun inputVGA(signal:String)fun inputDP(signal:String)fun inputDVI(signal:String)
}

/*** 要适配的类*/
open class ModemOutput {fun outputHDMI(signal:String){println("设备输出${signal}给显示设备")}
}

新增抽象类,继承源文件ModemOutput、实现目标接口,覆写空方法,不做具体实现。


abstract class OutputAdapter:ModemOutput(),SourceInput {override fun inputDP(signal: String) {TODO("Not yet implemented")}override fun inputDVI(signal: String) {TODO("Not yet implemented")}override fun inputVGA(signal: String) {TODO("Not yet implemented")}
}

客户端只根据自己需要的,具体实现信号输入方法。


val adapter = object : OutputAdapter() {override fun inputDVI(signal: String) {super.inputDVI(signal)println("【转HDMI信号转换器】>> 接收到了源设备,输入的${signal}")val digital = convertSignalToHDMI(signal)outputHDMI(digital)}}private fun convertSignalToHDMI(signal: String): String {when (signal) {"VGA信号" -> {println("【转HDMI信号转换器】>> 转HDMI转化器将${signal}转化成HDMI数字信号")}"DP信号" -> {println("【转HDMI信号转换器】>> 转HDMI转化器将${signal}转化成HDMI数字信号")}"DVI信号" -> {println("【转HDMI信号转换器】>> 转HDMI转化器将${signal}转化成HDMI数字信号")}else ->{throw IllegalArgumentException("输入信号格式不支持")}}return "HDMI数字信号"}

总结


适配器模式可以以类适配器或对象适配器的形式实现,灵活性高。类适配器使用多重继承(在Java中通过接口实现),对象适配器通过组合来实现,原本由于接口不兼容而无法一起工作的类可以协同工作,从而提高了代码的复用性,允许通过引入新的适配器来适应新需求,而无需修改现有的代码,从而实现了开闭原则。

这篇关于【Kotlin设计模式】Kotlin实现适配器模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111299

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert