设计模式-11-适配器模式

适配器模式是一种结构型设计模式, 它能使接口不兼容的对象能够相互合作。

适配器模式通过封装对象将复杂的转换过程隐藏于幕后, 被封装的对象甚至察觉不到适配器的存在。 其还有助于采用不同接口的对象之间的合作。

在适配器模式中,有三个角色:

  • Target(目标接口): 定义客户端使用的与特定领域相关的接口。
  • Adapter(适配器): 把源接口转换成目标接口。它通常是一个包装器,它会封装一个已有的类,并将这个类的接口转换为目标接口。
  • Adaptee(源接口): 定义了需要被适配的接口
Adaptee

代码实现

代码路径:https://github.com/XBoom/DesignPatterns/tree/main/10_Adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 目标接口
type Target interface {
Request() string
}

// 源接口
type Adaptee interface {
SpecificRequest() string
}

// 源接口的具体实现
type ConcreteAdaptee struct{}

func (a *ConcreteAdaptee) SpecificRequest() string {
return "Specific request."
}

// 适配器
type Adapter struct {
adaptee Adaptee //包含源接口
}

//实现目标接口
func (a *Adapter) Request() string {
return "Adapter: " + a.adaptee.SpecificRequest()
}

运行

1
2
3
4
5
adaptee := &ConcreteAdaptee{}
adapter := &Adapter{adaptee}

result := adapter.Request()
fmt.Println(result)

结果

1
Adapter: Specific request.

其实就是适配器包含原接口,实现目标接口,在实现中调用原接口逻辑

适用场景

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

总结

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

参考链接

  1. https://lailin.xyz/post/adapter.html
  2. https://refactoringguru.cn/design-patterns/adapter