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

适配器模式

概述

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

小结

  • 模式定义

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

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

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

相关推荐
骄马之死15 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
zhengfei61115 小时前
第3章 Agent 类型分类与设计模式
设计模式
GoGeekBaird16 小时前
Anthropic技能"(Skills)的经验分享
后端
王码码203516 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web
刀法如飞16 小时前
一文搞懂DDD 领域驱动设计思想原理
设计模式·架构·代码规范
郑洁文16 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
螺丝钉code17 小时前
JAVA项目 Claude code CLAUDE.md 到底应该怎么写
java·人工智能·claude code
指令集梦境18 小时前
Cursor + Spring Boot实战:从零写一个RESTful API
spring boot·后端·restful
摇滚侠18 小时前
Maven 入门+高深 单一架构案例 54-59
java·架构·maven·intellij-idea