设计模式-结构型-适配器模式 你适配了吗?

202 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

前言

适配器模式介绍

适配器顾名思义就是起一个适配的作用,主要就是让无法一起工作的类一起工作。一般情况分为类适配器和对象适配器模式,推荐使用对象适配器

简介

定义

适配器模式( Adapter )隶属于结构型,原理主要是把一个类的接口变成外部调用者所能使用的接口,消除了软件系统的不匹配性。

特点

优点

  1. 没有逻辑关联的类可以一起运行。灵活性高,且低耦合
  2. 将现有接口实现类隐藏,增加了类的透明度。

缺点:

  1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。

理解实现

现实模型

大家都知道我有一个卖果子的老乡叫阿珍,最近阿珍买了一台进口的榨汁机,但是这台美版的榨汁机标准电压是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(){
    	// 会员信息组合
    }
}

适用环境

适配器大多数情况下不是在编码初期的设计阶段进行的,而是解决正在运行的项目中的痛点,即现有接口可能无法改变,但又无法提供给新业务使用的场景。推荐使用对象适配器模式