外观模式是一种结构型设计模式,能为程序库、框架或其他复杂类提供一个简单的接口。

使用场景

  1. 复杂系统的简化接口:当系统包含多个子系统,每个子系统有各自的接口和实现时,外观模式可以提供一个简化的接口,客户端只需与外观对象进行交互,而无需直接与各个子系统打交道。
  2. 为遗留代码提供简化接口:在现代化系统中,可能需要与一些旧的、复杂的遗留代码进行交互。外观模式可以封装这些遗留系统的复杂性,为现代化的客户端提供一个更简单的接口。
  3. 解耦客户端与子系统之间的关系:外观模式可以帮助将客户端与子系统之间的耦合度降低,因为客户端只需与外观对象进行交互,而不需要了解子系统的实现细节。
  4. 系统的层次化结构:在系统中存在多个层次结构时,外观模式可以在每个层次提供一个外观对象,使得客户端可以更轻松地操作这些层次结构,而无需了解每个层次的内部细节。
  5. 简化复杂库的使用:在使用某些复杂的第三方库或 API 时,外观模式可以为客户端提供一个简化的接口,使得客户端使用起来更加方便。

代码实现

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
39
40
41
package main

import "fmt"

// 子系统1
type Subsystem1 struct{}

func (s *Subsystem1) Operation1() {
fmt.Println("Subsystem1: Operation1")
}

// 子系统2
type Subsystem2 struct{}

func (s *Subsystem2) Operation2() {
fmt.Println("Subsystem2: Operation2")
}

// 外观
type Facade struct {
subsystem1 *Subsystem1
subsystem2 *Subsystem2
}

func NewFacade() *Facade {
return &Facade{
subsystem1: &Subsystem1{},
subsystem2: &Subsystem2{},
}
}

func (f *Facade) Operation() {
fmt.Println("Facade: Operation")
f.subsystem1.Operation1()
f.subsystem2.Operation2()
}

func main() {
facade := NewFacade()
facade.Operation()
}

结语

外观模式帮助我们管理复杂系统的复杂性,并提供一个简单的接口供客户端使用。通过隐藏系统的内部实现细节,外观模式可以降低系统的耦合度,提高系统的灵活性和可维护性。在设计软件系统时,考虑使用外观模式来简化接口,并使系统更易于理解和维护。


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。