【Kotlin筹划模式】Kotlin实现适配器模式

打印 上一主题 下一主题

主题 547|帖子 547|积分 1641

前言


适配器模式(Adapter Pattern)的焦点将某个类的接口转换成客户端期望的另一个接口表示,使得客户端可以或许通过本身期望的接口与不兼容的类进行交互。适配器模式有三种实现方式,分别是类适配器模式、对象适配器模式、 接口适配器模式。
我们假设有个视频输出盒子,当前只能接收和输出HDMI信号,现在客户的输入设备只能输出VGA信号,则我们可以通过转换器(要适配的类),将VGA信号转换成HDMI信号做输出。



实现


1、类适配器模式

客户目的接口,客户的新设备只能输出VGA信号,无法输出HDMI信号。
  1. /**
  2. * 客户目标输入接口
  3. */
  4. interface SourceInput {
  5.     fun inputVGA(signal:String)
  6. }
复制代码
Modem盒子只接收且输出HDMI信号,调制后输出给到显示设备进行显示。
  1. /**
  2. * 要适配的类
  3. */
  4. open class ModemOutput {
  5.     fun outputHDMI(signal:String){
  6.         println("设备输出${signal}给显示设备")
  7.     }
  8. }
复制代码
新的输入设备输出VGA模拟信号不满足现在的需求,我们通过定义转换器OutputAdapter,将VGA模拟信号转化成HDMI数字信号进行输出到Modem盒子中。
  1. /**
  2. * 转换器
  3. */
  4. class OutputAdapter : ModemOutput(), SourceInput {
  5.     override fun inputVGA(signal: String) {
  6.         if ("VGA模拟信号" == signal) {
  7.             println("【转HDMI信号转换器】>> 接收到了源设备,输入的${signal}")
  8.             val digital = convertVGAToHDMI(signal)
  9.             outputHDMI(digital)
  10.         } else {
  11.             throw IllegalArgumentException("输入信号错误")
  12.         }
  13.     }
  14.     private fun convertVGAToHDMI(signal: String): String {
  15.         println("【转HDMI信号转换器】>> 转化器将${signal}转化成HDMI数字信号")
  16.         return "HDMI数字信号"
  17.     }
  18. }
复制代码
客户端
  1. val adapter = OutputAdapter() as SourceInput
  2. adapter.inputVGA("VGA模拟信号")
  3. // 【转HDMI信号转换器】>> 接收到了源设备,输入的VGA模拟信号
  4. // 【转HDMI信号转换器】>> VGA转HDMI转化器将VGA模拟信号转化成HDMI数字信号
  5. //  设备输出HDMI数字信号给显示设备
复制代码
适配器类必要继承ModemOutput,Java是单继承模式,以是目的文件必须要是接口。

2、对象适配器模式

对象适配器模式较类适配器模式相比,原来的适配器不再继承要适配的类,将其作为适配器的构造参数传入,把继承解耦。
  1. /**
  2. * 要适配的类
  3. */
  4. open class ModemOutput {
  5.     fun outputHDMI(signal:String){
  6.         println("设备输出${signal}给显示设备")
  7.     }
  8. }
复制代码
  1. /**
  2. * 目标接口
  3. */
  4. interface SourceInput {
  5.     fun inputVGA(signal:String)
  6. }
复制代码
  1. /**
  2. * 转换器
  3. */
  4. class OutputAdapter(output: ModemOutput) : SourceInput {
  5.     private var mOutput:ModemOutput = output
  6.     override fun inputVGA(signal: String) {
  7.         if ("VGA模拟信号" == signal) {
  8.             println("【转HDMI信号转换器】>> 接收到了源设备,输入的${signal}")
  9.             val digital = convertVGAToHDMI(analog)
  10.             mOutput.outputHDMI(signal)
  11.         } else {
  12.             throw IllegalArgumentException("输入信号错误")
  13.         }
  14.     }
  15.     private fun convertVGAToHDMI(signal: String): String {
  16.         println("【转HDMI信号转换器】>> VGA转HDMI转化器将${signal}转化成HDMI数字信号")
  17.         return "HDMI数字信号"
  18.     }
  19. }
复制代码

3、接口适配器模式

接口适配器模式实用于目的接口中有多个方法,上面我们举了个目的接口中输入VGA的例子,如果还有DP接口、DVI接口的输入,适配器类在实现目的接口时候就要都实现其他的方法,但是客户端输入只有一种,不必要实现全部接口时,如果适配器定义抽象类来实现接口,而且接口中方法空实现,可以灵活解决这个问题。
目的接口新增格式信源输入方法,要适配的类稳固。
  1. /**
  2. * 目标接口
  3. */
  4. interface SourceInput {
  5.     fun inputVGA(signal:String)
  6.     fun inputDP(signal:String)
  7.     fun inputDVI(signal:String)
  8. }
复制代码
  1. /**
  2. * 要适配的类
  3. */
  4. open class ModemOutput {
  5.     fun outputHDMI(signal:String){
  6.         println("设备输出${signal}给显示设备")
  7.     }
  8. }
复制代码
新增抽象类,继承源文件ModemOutput、实现目的接口,覆写空方法,不做详细实现。
  1. abstract class OutputAdapter:ModemOutput(),SourceInput {
  2.     override fun inputDP(signal: String) {
  3.         TODO("Not yet implemented")
  4.     }
  5.     override fun inputDVI(signal: String) {
  6.         TODO("Not yet implemented")
  7.     }
  8.     override fun inputVGA(signal: String) {
  9.         TODO("Not yet implemented")
  10.     }
  11. }
复制代码
客户端只根据本身必要的,详细实现信号输入方法。
  1. val adapter = object : OutputAdapter() {
  2.          override fun inputDVI(signal: String) {
  3.              super.inputDVI(signal)
  4.              println("【转HDMI信号转换器】>> 接收到了源设备,输入的${signal}")
  5.              val digital = convertSignalToHDMI(signal)
  6.              outputHDMI(digital)
  7.          }
  8.      }
  9. private fun convertSignalToHDMI(signal: String): String {
  10.      when (signal) {
  11.          "VGA信号" -> {
  12.              println("【转HDMI信号转换器】>> 转HDMI转化器将${signal}转化成HDMI数字信号")
  13.          }
  14.          "DP信号" -> {
  15.              println("【转HDMI信号转换器】>> 转HDMI转化器将${signal}转化成HDMI数字信号")
  16.          }
  17.          "DVI信号" -> {
  18.              println("【转HDMI信号转换器】>> 转HDMI转化器将${signal}转化成HDMI数字信号")
  19.          }
  20.          else ->{
  21.              throw IllegalArgumentException("输入信号格式不支持")
  22.          }
  23.      }
  24.      return "HDMI数字信号"
  25. }
复制代码

总结


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表