Dawn's Blogs

分享技术 记录成长

0%

Easy搞定Golang设计模式 (5) 结构型模式之适配器模式 外观模式

适配器模式

适配器模式将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器的核心在于将一个适配者 Adaptee,通过适配器 Adapter 转换为另一个接口 Target 来使用。实现原理就是 Adapter 通过实现 Target 接口,并在对应的方法中调用 Adaptee 的接口实现。

适配器模式的角色和职责如下:

  • 目标抽象类 Target:定义客户所需要的接口,也可以是具体类。
  • 适配器类 Adapter:适配器类是适配器模式的核心,在对象适配器中,它通过继承(活实现)Target 并关联一个 Adaptee 对象使二者产生联系。
  • 适配者类 Adaptee:被适配的角色,它定义了一个已经存在的接口,这个接口需要适配。

image-20230418212755861

案例

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
27
28
29
30
31
32
33
34
35
36
37
38
// Target 是适配的目标接口
type Target interface {
Request() string
}

// Adaptee 是被适配的目标接口
type Adaptee interface {
SpecificRequest() string
}

// Src 实现被适配的目标接口
type Src struct {}

func (s *Src) SpecificRequest() string {
return "Src specific request"
}

// adapter 适配器,实现 Target 接口
type adapter struct {
adaptee Adaptee
}

func NewAdapter(adaptee Adaptee) Target {
return &adapter {
adaptee: adaptee,
}
}

func (a *adapter) Request() string {
return a.adaptee.SpecificRequest()
}

func main() {
var target Target
target = NewAdapter(new(Src)) // 将 Src 适配成了 Target

fmt.Println(target.Request())
}

优缺点

优点:

  • 目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无须修改原有结构
  • 增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一个适配者类可以在多个不同的系统中复用。
  • 灵活性和扩展性都非常好,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合开闭原则。

缺点:

  • 比较麻烦。

外观模式

根据迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。

外观模式将众多子功能组合起来,提供一个简单一致的界面(Facade)。外观模式的角色和职责如下:

  • 外观角色 Facade:对外提供的接口,定义简单的调用接口。
  • 子系统角色 SubSystem:功能的提供者,为外观角色提供子功能。

image-20230418214623967

案例

外观模式的案例:将电视、游戏机、灯等子功能进行组合,形成家庭影院这个外观角色。家庭影院只对外提供看电影、KTV、打游戏这三项功能,这些功能都是子功能的组合。

image-20230418214659825