一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
前言
适配器模式介绍
适配器顾名思义就是起一个适配的作用,主要就是让无法一起工作的类一起工作。一般情况分为类适配器和对象适配器模式,推荐使用对象适配器
简介
定义
适配器模式( Adapter )隶属于结构型,原理主要是把一个类的接口变成外部调用者所能使用的接口,消除了软件系统的不匹配性。
特点
优点
- 没有逻辑关联的类可以一起运行。灵活性高,且低耦合
- 将现有接口实现类隐藏,增加了类的透明度。
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
理解实现
现实模型
大家都知道我有一个卖果子的老乡叫阿珍,最近阿珍买了一台进口的榨汁机,但是这台美版的榨汁机标准电压是110V,国内插座输出电压都是220V,阿珍找到我问我怎么搞,我告诉他去掘金搜索适配器就懂了,临走阿珍为了感激我,送了一袋果子,我回家吃了写水文。
分析模型
主线:阿珍买了110V的美版榨汁机,又买来220V转接头解决,我吃完写水文。
模型1: 阿珍 -> 消费者
模型2: 110V榨汁机 -> 目标类
模型3: 220V插座 -> 源类
模型4: 220V转接头 -> 适配器类
阿珍(消费者)
class AZhen:MeiNv {
fun main(){
// 类适配调用
val adapter = 110VAdapter()
adapter.inPut110V()
// 对象适配调用
val adapter1 = 110VAdapter(220VPower())
adapter1.inPut110V()
}
}
110V榨汁机 ( 目标接口)
interface I110V{
fun inPut110V()
}
220V插座(源类)
class 220VPower:I220V{
fun outPut220V:Int{
println("输出电压220V")
return 220
}
}
220V转接头 (适配器类)
// 类适配模式
class 110VAdapter :220VPower,I110V {
override fun inPut110V{
outPut220V()/2
println("标准电压110V")
}
}
// 对象适配器模式
class 110VAdapter(val power:220VPower) :I110V {
override fun inPut110V{
power.outPut220V()/2
println("标准电压110V")
}
}
使用实例
下面以两种人员信息的交互作为讲解,登录app的人员信息在公司模块属于员工,但是同样的员工在会员模块又属于会员,这是就需要两者信息进行互相转化。这时我们就考虑到使用适配器
会员目标
interface IMember{
fun isMember()
}
员工
class Employee {
val name:String= "name"
val age:Int = 26
}
适配器
class Adapter():Employee,IMember {
override fun isMember(){
// 会员信息组合
}
}
class Adapter(val employee :Employee):IMember {
override fun isMember(){
// 会员信息组合
}
}
适用环境
适配器大多数情况下不是在编码初期的设计阶段进行的,而是解决正在运行的项目中的痛点,即现有接口可能无法改变,但又无法提供给新业务使用的场景。推荐使用对象适配器模式