设计模式-外观模式

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

facade.png

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. 中介者模式:中介者模式扮演各个参与者的中间人,使系统各个参与者解耦;而外观模式时形成更高级别的接口供他人调用。