掘金 后端 ( ) • 2024-05-05 17:13

theme: smartblue

该系列文章总结常见设计模式的概念、使用场景与Go的实现方案,,但实际上Go语言并不需要刻意地去过度使用设计模式,反而与Go大道至简地思想冲突。

本篇介绍适配器模式

适配器模式:

概念介绍:

适配器模式标准uml如图:

image.png

该设计模式主要功能是为了将两个不兼容的接口or类通过适配器进行适配使得双方能够兼容起来 该设计模式中会涉及到如下几个核心角色:

如图中所示角色中:

Target(目标抽象类):是一类含有指定功能(使用者所定义)的接口或者类

Adapter(适配器类):能够将 adaptee 适配转换成 target 的功能类,而适配器类是适配器模式中的核心,它通过实现Target接口并组合一个Adaptee对象使二者产生联系。

Adaptee(适配者类): 适配者就是需要适配的角色,它定义了一个自己的类,但是它与target并不兼容,因此需要适配器类对它进行一定的适配


例如有这么一个场景,是比较贴近生活的,假设苹果手机充电插口宽度是2cm,而华为手机充电插口宽度是1cm,这个时候我想使用苹果充电器给华为手机充电是不是不兼容的,这个时候如果我们有一个适配器,它去接受2cm的插口,再输出1cm的插口,那是不是就和华为手机适配了。看到这里想必这个适配器模式也就“原形毕露”了。

那接下来就用代码演示一下这所谓适配器模式的设计思路:

type HuaWeiCharger interface {
    Output1CM()
}


type AppleCharger struct {
}


func NewAppleCharger() *AppleCharger {
    return &AppleCharger{}
}


func (h *AppleCharger) Output2CM() {
    fmt.Println("苹果手机充电器插口宽度两厘米...")
}

// 此时的苹果充电器手机是没有实现华为充电器接口,需要一个适配器进行转换


type AppleChargerAdapter struct {
    core *AppleCharger  //组合一个Adaptee对象
}


func NewAppleChargerAdapter(a *AppleCharger) *AppleChargerAdapter {
    return &AppleChargerAdapter{
        core: a,
    }
}


func (a *AppleChargerAdapter) Output1CM() {
    m.core.Output2CM()
    fmt.Println("适配器将插口宽度调整为 1CM...")
}


这样子AppleCharger也实现了HuaweiCharge的接口,那这就是适配器模式主要的核心思想。。

适配器模式优缺点与应用场景

优点:

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构,耦合度低。

  • 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。

  • 灵活性和扩展性都是非常不错的,target类与适配者完全解耦,通过适配器进行联系,适配者可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,符合开闭原则。

缺点:

适配器中置换适配者类的某些方法可能会比较麻烦。

适应场景

系统需要使用一些现有的类,而这些类的接口不符合系统的需要,这时候就需要设计一个适配器来适配系统