外观模式又称为门面模式,它是一种结构型模式。引入外观模式后调用方与多个子系统的通信必须通过一个统一的外观对象进行,外观模式为子系统中的功能接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这些子系统更加容易使用。
外观模式的实现代码
package main
import "fmt"
//电视机
type TV struct {}
func (t *TV) On() {
fmt.Println("打开 电视机")
}
func (t *TV) Off() {
fmt.Println("关闭 电视机")
}
//电视机
type VoiceBox struct {}
func (v *VoiceBox) On() {
fmt.Println("打开 音箱")
}
func (v *VoiceBox) Off() {
fmt.Println("关闭 音箱")
}
//灯光
type Light struct {}
func (l *Light) On() {
fmt.Println("打开 灯光")
}
func (l *Light) Off() {
fmt.Println("关闭 灯光")
}
//游戏机
type Xbox struct {}
func (x *Xbox) On() {
fmt.Println("打开 游戏机")
}
func (x *Xbox) Off() {
fmt.Println("关闭 游戏机")
}
//麦克风
type MicroPhone struct {}
func (m *MicroPhone) On() {
fmt.Println("打开 麦克风")
}
func (m *MicroPhone) Off() {
fmt.Println("关闭 麦克风")
}
//投影仪
type Projector struct {}
func (p *Projector) On() {
fmt.Println("打开 投影仪")
}
func (p *Projector) Off() {
fmt.Println("关闭 投影仪")
}
//家庭影院(外观)
type HomePlayerFacade struct {
tv TV
vb VoiceBox
light Light
xbox Xbox
mp MicroPhone
pro Projector
}
//KTV模式
func (hp *HomePlayerFacade) DoKTV() {
fmt.Println("家庭影院进入KTV模式")
hp.tv.On()
hp.pro.On()
hp.mp.On()
hp.light.Off()
hp.vb.On()
}
//游戏模式
func (hp *HomePlayerFacade) DoGame() {
fmt.Println("家庭影院进入Game模式")
hp.tv.On()
hp.light.On()
hp.xbox.On()
}
func main() {
homePlayer := new(HomePlayerFacade)
homePlayer.DoKTV()
fmt.Println("------------")
homePlayer.DoGame()
}
终端输出
外观模式的代码拆分
1.项目的准备工作
找到 go 的 GOPATH
$ go env //可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
2.创建文件夹
// -- 在项目文件夹 facade_case 里创建新文件夹
// facade -- 存放装饰者的全部文件
3.接口文件 -- facade文件夹
-- 无接口文件
4.结构体文件 -- facade文件夹
文件1 -- tv.go
package facade
import "fmt"
//电视机
type TV struct {}
func (t *TV) On() {
fmt.Println("打开 电视机")
}
func (t *TV) Off() {
fmt.Println("关闭 电视机")
}
文件2 -- voicebox.go
package facade
import "fmt"
//音箱
type VoiceBox struct {}
func (v *VoiceBox) On() {
fmt.Println("打开 音箱")
}
func (v *VoiceBox) Off() {
fmt.Println("关闭 音箱")
}
文件3 -- light.go
package facade
import "fmt"
//灯光
type Light struct {}
func (l *Light) On() {
fmt.Println("打开 灯光")
}
func (l *Light) Off() {
fmt.Println("关闭 灯光")
}
文件4 -- xbox.go
package facade
import "fmt"
//游戏机
type Xbox struct {}
func (x *Xbox) On() {
fmt.Println("打开 游戏机")
}
func (x *Xbox) Off() {
fmt.Println("关闭 游戏机")
}
文件5 -- microphone.go
package facade
import "fmt"
//麦克风
type MicroPhone struct {}
func (m *MicroPhone) On() {
fmt.Println("打开 麦克风")
}
func (m *MicroPhone) Off() {
fmt.Println("关闭 麦克风")
}
文件6 -- projector.go
package facade
import "fmt"
//投影仪
type Projector struct {}
func (p *Projector) On() {
fmt.Println("打开 投影仪")
}
func (p *Projector) Off() {
fmt.Println("关闭 投影仪")
}
文件7 -- homeplayerfacade.go
package facade
import "fmt"
//家庭影院(外观)
type HomePlayerFacade struct {
tv TV
vb VoiceBox
light Light
xbox Xbox
mp MicroPhone
pro Projector
}
//KTV模式
func (hp *HomePlayerFacade) DoKTV() {
fmt.Println("家庭影院进入KTV模式")
hp.tv.On()
hp.pro.On()
hp.mp.On()
hp.light.Off()
hp.vb.On()
}
//游戏模式
func (hp *HomePlayerFacade) DoGame() {
fmt.Println("家庭影院进入Game模式")
hp.tv.On()
hp.light.On()
hp.xbox.On()
}
5.主文件 -- main.go 在项目文件夹
package main
import (
"design/facade_case/facade"
"fmt"
)
func main() {
homePlayer := new(facade.HomePlayerFacade)
homePlayer.DoKTV()
fmt.Println("------------")
homePlayer.DoGame()
}