外观模式是一种结构型设计模式,它为复杂的子系统提供一个简单的接口。外观模式定义了一个高层接口,使得子系统更易于使用。
简化接口:为复杂的子系统提供一个简单的接口,使得客户端代码更易于使用。
降低耦合度:客户端只需要与外观类交互,而不需要了解子系统的复杂性。
提高可维护性:当子系统发生变化时,只需要修改外观类,而不需要修改客户端代码。
1.复杂系统的简化:当一个系统有多个复杂的子系统时,可以使用外观模式提供一个简单的接口。
2.遗留系统的集成:在集成遗留系统时,可以使用外观模式提供一个简单的接口。
3.多层架构:在多层架构中,可以使用外观模式提供不同层之间的简单接口。
package main
import (
"fmt"
)
// 音响系统
type Amplifier struct{}
func (a *Amplifier) On() {
fmt.Println("Amplifier is on")
}
func (a *Amplifier) Off() {
fmt.Println("Amplifier is off")
}
func (a *Amplifier) SetVolume(volume int) {
fmt.Printf("Amplifier volume set to %d\n", volume)
}
// 投影仪系统
type Projector struct{}
func (p *Projector) On() {
fmt.Println("Projector is on")
}
func (p *Projector) Off() {
fmt.Println("Projector is off")
}
func (p *Projector) WideScreenMode() {
fmt.Println("Projector in widescreen mode")
}
// 灯光系统
type Lights struct{}
func (l *Lights) On() {
fmt.Println("Lights are on")
}
func (l *Lights) Off() {
fmt.Println("Lights are off")
}
func (l *Lights) Dim(dim int) {
fmt.Printf("Lights dimmed to %d\n", dim)
}
// 家庭影院外观类
type HomeTheaterFacade struct {
amplifier *Amplifier
projector *Projector
lights *Lights
}
func NewHomeTheaterFacade(amplifier *Amplifier, projector *Projector, lights *Lights) *HomeTheaterFacade {
return &HomeTheaterFacade{
amplifier: amplifier,
projector: projector,
lights: lights,
}
}
func (htf *HomeTheaterFacade) WatchMovie(movie string) {
fmt.Printf("Get ready to watch a movie: %s\n", movie)
htf.lights.Dim(10)
htf.projector.On()
htf.projector.WideScreenMode()
htf.amplifier.On()
htf.amplifier.SetVolume(5)
}
func (htf *HomeTheaterFacade) EndMovie() {
fmt.Println("Shutting movie theater down...")
htf.amplifier.Off()
htf.projector.Off()
htf.lights.On()
}
func main() {
// 创建各个子系统
amplifier := &Amplifier{}
projector := &Projector{}
lights := &Lights{}
// 创建外观类
homeTheater := NewHomeTheaterFacade(amplifier, projector, lights)
// 使用外观类控制家庭影院
homeTheater.WatchMovie("Inception")
homeTheater.EndMovie()
}