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

适配器模式

概述

​ 适配器其实非常好理解,放到生活中来,我们身边处处都有这样的例子,最常见的是用的比较多的各种转接线(如: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 继承了目标类和待适配的类)。

小结

  • 模式定义

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

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

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

相关推荐
sniper_fandc2 分钟前
SpringBoot系列—MyBatis(xml使用)
java·spring boot·mybatis
mCell16 分钟前
为什么我们需要 `.proto` 文件
后端·微服务·架构
胚芽鞘68131 分钟前
查询依赖冲突工具maven Helper
java·数据库·maven
Charlie__ZS36 分钟前
若依框架去掉Redis
java·redis·mybatis
mit6.82442 分钟前
[Meetily后端框架] AI摘要结构化 | `SummaryResponse`模型 | Pydantic库 | vs marshmallow库
c++·人工智能·后端
陈随易1 小时前
VSCode v1.102发布,AI体验大幅提升
前端·后端·程序员
tianchang1 小时前
SSR 深度解析:从原理到实践的完整指南
前端·vue.js·设计模式
生无谓1 小时前
什么是跨域,如何处理跨域
后端
咖啡啡不加糖1 小时前
RabbitMQ 消息队列:从入门到Spring Boot实战
java·spring boot·rabbitmq
Smilejudy1 小时前
极具特色的位置运算
后端