外观模式(Facade Pattern)

这个模式即便没听说过,也很可能在很多地方已经使用了,是非常常用的设计模式之一,完美体现了面向对象“封装”的特性。简单说就是通过一个“外观”将系统内部的实现隐藏起来,将外部系统和内部系统进行解耦。

facade.png

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
package main

import (
"fmt"
)

type SysA struct{}

func (a SysA) show() {
fmt.Println("in SysA show")
}

type SysB struct{}

func (b SysB) show() {
fmt.Println("in SysB show")
}

type SysC struct{}

func (c SysC) show() {
fmt.Println("in SysC show")
}

type Facade struct {
a *SysA
b *SysB
c *SysC
}

func (f Facade) show() {
f.a.show()
f.b.show()
f.c.show()
}

func main() {
facade := Facade{new(SysA), new(SysB), new(SysC)}
facade.show()
}

使用场景

  1. 系统内部复杂度较高,需要一个更高级别的简单接口简化操作时。
  2. 需要层级化子系统、简化子系统之间依赖性时。

对比

  1. 单例模式:一般情况下,外观模式会结合单例模式来使用,供外部应用调用。
  2. 中介者模式:中介者模式扮演各个参与者的中间人,使系统各个参与者解耦;而外观模式时形成更高级别的接口供他人调用。