适配器模式

简介: 适配器模式

适配器模式


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


模型说明


对象适配器



  • Client:是包含当前程序业务逻辑的类
  • 客户端代码只需通过与适配器交互即可,无需与具体的适配器耦合。因此,你可以向程序中添加新类型的适配器而无需修改已有代码。这在服务类的接口被更改或替换时很有用:你无需修改客户端代码就可以创建新的适配器类。
  • Client Interface:描述了其他类与客户端代码合作时必须遵循的协议
  • Service:有一些功能类(通常来自第三方或遗留系统)。客户端与其接口不兼容,因此无法直接调用其功能。
  • Adapter:是一个可以同时与客户端和服务端交互的类:它是实现客户端接口的同时封装了服务对象。适配器接受客户端通过适配器接口发起的调用,并将其转换为被封装服务对象的调用。


类适配器


  • Adapter:不需要封装任何对象,因为它同时继承了客户端和服务端的行为。适配功能在重写的方法中完成。最后生成的适配器可替代已有的客户端类进行使用。


优缺点


1.优点

  • 单一职责原则:你可以将接口或数据转换代码从程序主要业务逻辑中分离。
  • 开闭原则:只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器。


2.缺点


  • 代码整体复杂度增加, 因为你需要新增一系列接口和类。 有时直接更改服务类使其与其他代码兼容会更简单。


使用场景


  • 当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
  • 如果您需要复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。


参考代码


我们使用一个常见的场景来描述一下:电脑插口


我们的 mac 电脑已经实现了 lighting 接口,但是我们手头上还有一台 Windows 电脑没有实现 lighting 接口,那么我们就需要一个适配器来帮助我们实现了。


// client.go 客户端代码
package main
import "fmt"
type Client struct{}
func (c *Client) InsertLightningConnectorIntoComputer(com Computer) {
 fmt.Println("Client inserts Lightning connector into computer.")
 com.InsertIntoLightningPort()
}
// computer.go 客户端接口
package main
type Computer interface {
 InsertIntoLightningPort()
}
// mac.go 类似服务
package main
import "fmt"
type Mac struct{}
func (m *Mac) InsertIntoLightningPort() {
 fmt.Println("Lightning connector is plugged into mac machine.")
}
// windows.go 未知服务,外部服务
package main
import "fmt"
type Windows struct{}
func (w *Windows) insertIntoUSBPort() {
 fmt.Println("USB connector is plugged into windows machine.")
}
// windowsAdapter.go 适配器
package main
import "fmt"
type WindowsAdapter struct {
 windowMachine *Windows
}
func (w *WindowsAdapter) InsertIntoLightningPort() {
 fmt.Println("Adapter converts Lightning signal to USB.")
 w.windowMachine.insertIntoUSBPort()
}
// main.go
package main
func main() {
 client := &Client{}
 mac := &Mac{}
 client.InsertLightningConnectorIntoComputer(mac)
 windowsMachine := &Windows{}
 windowsMachineAdapter := &WindowsAdapter{
  windowMachine: windowsMachine,
 }
 client.InsertLightningConnectorIntoComputer(windowsMachineAdapter)
}


output:


Client inserts Lightning connector into computer.
Lightning connector is plugged into mac machine.
Client inserts Lightning connector into computer.
Adapter converts Lightning signal to USB.
USB connector is plugged into windows machine.
相关文章
|
7月前
|
设计模式
适配器模式
​ 如有错误或有补充,以及任何改进的意见,请留下您的高见 概念 适配器模式是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一个接口,从而使得原本由于接口不兼容而不能一起工作的两个类能够协同工作。 适配器模式中的角色包括目标接口(Target)、需要适配的类(Adaptee)和适配器(Adapter)。目标接口是客户端所期望的接口,需要适配的类是需要被适配的类或适配者类,适配器则是将需要适配的类的接口转换成目标接口的实现类。         源(Adaptee):这个角色通常是一个已经存在的类或者接口,其方法或行为与客户端所期望的不完全一致。源角色定义了需要被适配的接口,这
51 0
|
7月前
|
设计模式 uml
设计模式-适配器模式(对象适配器)
设计模式-适配器模式(对象适配器)
44 0
|
7月前
|
设计模式 C++
结构型 适配器模式
结构型 适配器模式
43 0
|
7月前
|
设计模式
【适配器模式】—— 每天一点小知识
【适配器模式】—— 每天一点小知识
|
Java API
适配器模式的运用
适配器模式的运用
89 0
|
设计模式 数据库 C++
2023-6-15-第六式适配器模式
2023-6-15-第六式适配器模式
99 0
|
设计模式 前端开发
关于适配器模式我所知道的
关于适配器模式我所知道的
49 0
|
Java 程序员 API
结构型模式-适配器模式
结构型模式-适配器模式
93 0
|
设计模式
我学会了,适配器模式
适配器模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
104 0
我学会了,适配器模式
|
设计模式 Java Spring
适配器模式详解与应用
引用一个最经典的例子,我们自己家里的电压都是220V的,而早期的手机充电时所用的都是5V的电压。要想让手机在220V的家庭电压下充电,就需要一个电源适配器。在编程中,也经常会出现一个类程序无法直接去使用,而需要通过适当变换的行为抽象出来的设计模式就是适配器模式。