模式定义
将一个类的接口转换成客户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
类图
应用场景
1.当你希望使用某些现有类,但其接口与你的其他代码不兼容时;
2.当你希望重用几个现有的子类,这些子类缺少一些不能添加到父类中的公共功能时;
优点
1.符合单一职责原则;
2.符合开闭原则
要点总结
- Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用
- GoF 23定义了两种Adapter模式的实现结构,对象适配器和类适配器,但类适配器采用“多继承”的实现方式,一般不推荐使用,对象适配器采用“对象组合”的方式,更符合松耦合精神
Go语言代码实现
工程目录
adapter.go
package Adapter
import "fmt"
//适配的目标接口
type Target interface {
Request()
}
//被适配的接口
type Adaptee struct {
}
//实际函数
func (a *Adaptee) SpecficRequest() {
fmt.Println("SpecficRequest")
}
type Adapter struct {
*Adaptee
}
func (a *Adapter) Request() {
a.SpecficRequest()
}
adapter_test.go
package Adapter
import (
"testing"
)
func TestAdapter_Request(t *testing.T) {
adaper := Adapter{} //适配器
adaper.Request()
}
装饰者模式(Decorator Pattern)和适配器模式(Adapter Pattern)是两种常见的结构型设计模式,它们有一些相似之处,但也存在一些明显的差异。
异同点如下:
相同点:
两者都是通过包装其他对象来实现功能扩展或接口转换。
装饰者模式和适配器模式都使用了对象组合,而非继承,来实现功能。
不同点:
目的不同:装饰者模式的目的是在不改变原始对象接口的情况下,动态地添加功能;适配器模式的目的是将一个接口转换成另一个接口,使得原本不兼容的接口能够一起工作。
关注点不同:装饰者模式关注的是对象功能的扩展,强调的是对对象行为的增强或修改;适配器模式关注的是接口的转换,强调的是在不改变原有代码的前提下,实现接口之间的兼容。
结构不同:装饰者模式通常涉及多个装饰类,通过层层装饰来实现功能的叠加;适配器模式通常涉及一个适配器类,用于将一个接口转换成另一个接口。
使用场景不同:装饰者模式适用于需要动态地为对象添加功能、扩展功能或修改功能的场景;适配器模式适用于已有系统中,需要将一个接口转换成另一个接口以实现兼容的场景。
举例说明:
装饰者模式的例子:假设我们有一个咖啡店,有不同种类的咖啡(例如,浓缩咖啡、拿铁咖啡)作为基本组件,我们可以使用装饰者模式来添加额外的调料(例如,牛奶、糖浆)以扩展咖啡的功能。每个调料都是一个装饰者,它们可以独立地对咖啡进行装饰,也可以组合使用。
适配器模式的例子:假设我们有一个音频播放器,支持播放MP3格式的音频文件,但现在我们要扩展它,使其能够播放其他格式的音频文件(例如,WAV、OGG)。我们可以创建一个适配器类,该适配器类实现音频播放器接口,并封装一个第三方音频库,通过适配器将第三方音频库的方法转换成音频播放器接口的方法,从而实现对其他音频格式的兼容。
总之,装饰者模式和适配器模式虽然有一些相似之处,但它们的目的、关注点、结构和使用场景存在明显的差异。装饰者模式用于动态地添加功能,而适配器模式用于接口转换以实现兼容。