元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
设计原则
单一职责原则
开闭原则
里氏替换原则
依赖倒置原则
接口隔离原则
迪米特法则
▶
创建型模式
工厂方法模式
抽象工厂
单例模式
建造者模式
原型模式
▶
结构型模式
适配器模式
装饰器模式
代理模式
外观模式
组合模式
桥接模式
享元模式
▶
行为型模式
策略模式
观察者模式
命令模式
模板方法模式
状态模式
责任链模式
迭代器模式
中介者模式
访问者模式
备忘录模式
解释器模式
发布时间:
2025-03-21 15:22
↑
☰
# 适配器模式 ## 概述 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器让原本由于接口不兼容而不能一起工作的类可以一起工作。 ## 问题场景 在软件开发中,我们经常会遇到以下场景: 1. 需要使用一个现有的类,但其接口与我们的需求不匹配 2. 想要复用一些现有的类,但不能修改它们的源代码 3. 需要统一多个类的接口 ## 解决方案 适配器模式通过创建一个包装类(适配器),来实现客户端期望的目标接口: ```mermaid classDiagram class Target { <<interface>> +request() } class Adapter { -adaptee +request() } class Adaptee { +specificRequest() } Target <|.. Adapter Adapter o-- Adaptee ``` 主要角色: 1. 目标接口(Target): 客户端期望的接口 2. 适配器(Adapter): 将源接口转换成目标接口 3. 源类(Adaptee): 需要被适配的类 ## 代码示例 ### 1. 基本实现 ```go // Target 定义客户端期望的接口 type Target interface { Request() string } // Adaptee 是需要被适配的类 type Adaptee struct{} func (a *Adaptee) SpecificRequest() string { return "Adaptee's specific request" } // Adapter 是适配器类 type Adapter struct { adaptee *Adaptee } func NewAdapter(adaptee *Adaptee) Target { return &Adapter{adaptee: adaptee} } func (a *Adapter) Request() string { // 转换调用 return "Adapter: (TRANSLATED) " + a.adaptee.SpecificRequest() } ``` ### 2. 实际应用示例 ```go // 假设我们有一个第三方支付接口 type ThirdPartyPayment interface { ProcessPayment(amount float64) error } // 支付宝支付实现 type AlipaySDK struct{} func (a *AlipaySDK) Pay(price float64, channel string) error { // 支付宝特定的支付逻辑 return nil } // 支付宝适配器 type AlipayAdapter struct { alipay *AlipaySDK } func NewAlipayAdapter(alipay *AlipaySDK) ThirdPartyPayment { return &AlipayAdapter{alipay: alipay} } func (a *AlipayAdapter) ProcessPayment(amount float64) error { // 适配支付宝接口 return a.alipay.Pay(amount, "ALIPAY") } ``` ## 适用场景 1. 封装遗留系统 - 当需要继续使用现有系统,但其接口与新系统不兼容时 - 可以通过适配器封装旧系统接口 2. 整合第三方库 - 使用第三方库时,其接口可能与系统定义的接口不一致 - 通过适配器使其符合系统接口规范 3. 统一接口 - 系统中存在多个类似功能但接口不同的类 - 需要提供统一的接口来操作这些类 ## 优缺点 ### 优点 1. 增加了类的透明性和复用性 - 将具体的实现封装在适配器中 - 客户端只需要关注目标接口 2. 提高了类的可扩展性 - 可以方便地添加新的适配器类 - 不需要修改原有代码 3. 符合开闭原则 - 可以引入新的适配器而无需修改现有代码 - 易于维护和扩展 ### 缺点 1. 增加了系统的复杂度 - 需要引入新的类和接口 - 可能会创建多个适配器类 2. 可能会降低代码的可读性 - 过多的适配器会使系统难以理解 - 需要额外的文档说明 ## 实现要点 1. 接口设计 - 明确目标接口的定义 - 分析源类的接口特点 - 设计合适的适配方式 2. 适配方式选择 - 类适配器(通过继承) - 对象适配器(通过组合) - 根据实际需求选择 3. 异常处理 - 处理源类可能的异常 - 转换成目标接口定义的异常 - 确保异常信息不丢失 ## 相关模式 1. 装饰器模式 - 装饰器模式注重于在不改变接口的情况下添加职责 - 适配器模式关注接口的转换 2. 代理模式 - 代理模式使用相同的接口 - 适配器模式转换不同的接口 3. 外观模式 - 外观模式定义新的接口 - 适配器模式复用已有接口 ## 总结 适配器模式是一种常用的结构型设计模式,它通过转换接口来实现不同类的协作。在实际开发中,当遇到接口不兼容的问题时,可以考虑使用适配器模式来解决。适配器模式的核心价值在于: 1. 复用性 - 可以复用现有的类 - 不需要修改源代码 2. 灵活性 - 可以方便地引入新的适配器 - 支持不同的适配方式 3. 可维护性 - 遵循单一职责原则 - 符合开闭原则 在使用适配器模式时,需要注意控制适配器的数量,避免过度使用导致系统变得复杂。同时,要做好适配器的文档说明,方便其他开发者理解和维护。