设计模式大白话——适配器模式

适配器模式

概述

​ 适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如:USB 转 Type-C),有了这个"适配器",我们就能够将电脑和手机等设备相进行连接,而不需要改动电脑/手机的原有接口。

示例

​ 回到编程的世界中,假设我们的某个程序一直依赖一个很久远的接口 OldBusinessInterface,这个时候由于业务需求,需要使用到比较新的接口 NewBusinessInterface,由于历史原因将不对旧的代码进行修改 ,因此目前的方案是将使用 适配器模式 去让 NewBusinessInterface 去适配 OldBusinessInterface

> 代码在线运行 <

go 复制代码
package main

import "fmt"

// OldBusinessInterface 这是旧的接口
type OldBusinessInterface interface {
	OldBusinessMethodA(str string) int
	OldBusinessMethodB()
}

// OldBusiness 这是旧的业务类,实现了旧的接口
type OldBusiness struct {
}

func (o *OldBusiness) OldBusinessMethodA(str string) int {
	fmt.Println("OldBusinessMethodA is called")
	return len(str)
}

func (o *OldBusiness) OldBusinessMethodB() {
	fmt.Println("OldBusinessMethodB is called")
}

// NewBusinessInterface 这是新的接口
type NewBusinessInterface interface {
	NewBusinessMethodA(str string) int
}

// NewBusiness 这是新的业务类,实现了新的接口
type NewBusiness struct {
}

func (n *NewBusiness) NewBusinessMethodA(str string) int {
	fmt.Println("NewBusinessMethodA is called")
	return len(str)
}

// OldBusinessMethod 这是旧的业务方法,依赖于旧的接口,但是新的业务类没有实现旧的接口
func OldBusinessMethod(a OldBusinessInterface) {
	a.OldBusinessMethodA("hello")
}

// Adapter 这是适配器,实现了旧的接口,但是依赖于新的接口,这样就可以在旧的业务方法中使用新的业务类了
type Adapter struct {
	NewBusinessInterface
}

func (a *Adapter) OldBusinessMethodA(str string) int {
	fmt.Println("[Adapter] OldBusinessMethodA is called")
	return a.NewBusinessMethodA(str)
}

func (a *Adapter) OldBusinessMethodB() {
	fmt.Println("[Adapter] OldBusinessMethodB is called")
}

func main() {
	// 旧的使用姿势
	OldBusinessMethod(&OldBusiness{})

	fmt.Println("------------------")

	// 使用适配器,可以在旧的业务方法中使用新的业务类了
	OldBusinessMethod(&Adapter{&NewBusiness{}})
}

运行结果:

bash 复制代码
OldBusinessMethodA is called
------------------
[Adapter] OldBusinessMethodA is called
NewBusinessMethodA is called

​ 通过适配器,我们能够将 B 接口变成 A 接口,通过这个方式,我们不需要再重新写一个新的实现类,而是只需要增加一个 适配器 ,这种感觉就是:你现在只有一个安卓充电线,但是你的手机是 Type-C 的接口,这个时候你只需要通过一个 转接线 就可以让 Type-C 接口的手机使用安卓充电线,而不用重新再买一个 Type-C 接口的充电器,这确实能够方便很多,当然,重新买一个充电器也并不是说不可取,这需要结合实际场景考虑各方面的因素来选择最合适的方案。

适配器的种类

​ 实际上,适配器有"两种":对象适配器类适配器

  • 对象适配器

  • 类适配器

​ 其实本质上只是适配的目标不同而已,我们刚才的代码是针对接口而做的适配,其实就是对象适配器 ,对于类适配器,其实就是针对类型进行适配(在 Java 中,就是对 Class 进行的适配),使用此方式的前提条件是 编程语言支持多继承 (如图,Adapter 继承了目标类和待适配的类)。

小结

  • 模式定义

    将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

​ 总结以上的内容,说白了,适配器其实就是一个中间层,可以让原本不兼容的接口转换 成目标接口,最核心的是 "转换" 二字。如果你了解过外观模式和装饰模式,你可能会对他们三个感到有些困惑,分不清他们的差异,不用担心,我在之后的文章会对他们三个的差异做出解释。

​ 以上便是本篇的全部内容了,如果内容存在又问题的地方欢迎指点。

相关推荐
陆业聪4 分钟前
基本数据类型:Kotlin、Dart (Flutter)、Java 和 C++ 的比较
java·flutter·kotlin
程序修理员5 分钟前
2个word内容合并
java·word
醇氧5 分钟前
【idea】更换快捷键
java·ide·intellij-idea
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO19 分钟前
java中的定时器
java·开发语言
薯条不要番茄酱1 小时前
数据结构-5.二叉树
java·开发语言·数据结构
YAy172 小时前
CC3学习记录
java·开发语言·学习·网络安全·安全威胁分析
代码小鑫2 小时前
A035-基于Spring Boot的企业内管信息化系统
java·开发语言·spring boot·后端·spring
Spy972 小时前
django 过滤器的执行
后端·python·django
qq_35323353893 小时前
【原创】java+ssm+mysql校园疫情防控管理系统设计与实现
java·mvc·javaweb·ssm框架·bs·疫情防控
灼华十一5 小时前
数据结构-布隆过滤器和可逆布隆过滤器
数据结构·算法·golang