设计模式-外观模式
这个模式即便没听说过,也很可能在很多地方已经使用了,是非常常用的设计模式之一,完美体现了面向对象“封装”的特性。简单说就是通过一个“外观”将系统内部的实现隐藏起来,将外部系统和内部系统进行解耦。
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()
}
使用场景
- 系统内部复杂度较高,需要一个更高级别的简单接口简化操作时。
- 需要层级化子系统、简化子系统之间依赖性时。
对比
- 单例模式:一般情况下,外观模式会结合单例模式来使用,供外部应用调用。
- 中介者模式:中介者模式扮演各个参与者的中间人,使系统各个参与者解耦;而外观模式时形成更高级别的接口供他人调用。