1 概念
外观模式(facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
如果定义不是很理解的话,读者可以对照下面电脑的例子认真思考一下:
电脑整机时CPU、内存、硬盘等的外观,有了这个外观之后,启动电脑和关闭电脑都简化了。
UML类图:
外观模式主要包含两个角色:
- Facade(外观角色): 在客户端可以调用这个角色的方法,在外观角色中可以知道相关的子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派道相应的子系统中去,传递给相应的子系统对象处理。
- SubSystem(子系统角色): 在软件系统中可以由一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅时另一个客户端而已。
2 go语言实现
2.1 子系统角色实现
type Power struct{}
func (p Power) PowerOn() {
fmt.Println("电源通电")
}
func (p Power) PowerOff() {
fmt.Println("电源下电")
}
type Mainboard struct{}
func (m Mainboard) PowerOn() {
fmt.Println("主板通电")
}
func (m Mainboard) PowerOff() {
fmt.Println("主板下电")
}
type CPU struct{}
func (cpu CPU) PowerOn() {
fmt.Println("CPU通电")
}
func (cpu CPU) PowerOff() {
fmt.Println("CPU下电")
}
2.2 外观角色实现
type Computer interface {
Boot()
Shutdown()
}
type DesktopComputer struct {
Power
Mainboard
CPU
}
func (dc DesktopComputer) Boot() {
fmt.Println("台式机开始启动")
dc.Power.PowerOn()
dc.Mainboard.PowerOn()
dc.CPU.PowerOn()
fmt.Println("台式机启动完毕")
}
func (dc DesktopComputer) Shutdown() {
fmt.Println("台式机开始关机")
dc.Power.PowerOff()
dc.Mainboard.PowerOff()
dc.CPU.PowerOff()
fmt.Println("台式机关机完毕")
}
type Laptop struct {
Power
Mainboard
CPU
}
func (l Laptop) Boot() {
fmt.Println("笔记本电脑开始启动")
l.Power.PowerOn()
l.Mainboard.PowerOn()
l.CPU.PowerOn()
fmt.Println("笔记本电脑启动完毕")
}
func (l Laptop) Shutdown() {
fmt.Println("笔记本电脑开始关机")
l.Power.PowerOff()
l.Mainboard.PowerOff()
l.CPU.PowerOff()
fmt.Println("笔记本电脑关机完毕")
}
2.3 客户端调用
func main() {
tComputer := facade.NewComputer("d")
tComputer.Boot()
fmt.Println("=============")
tComputer.Shutdown()
fmt.Println("=============")
tComputer = facade.NewComputer("l")
tComputer.Boot()
fmt.Println("=============")
tComputer.Shutdown()
}