外观模式

外观模式的概念

外观模式是一种结构型设计模式,它为复杂的子系统提供一个简单的接口。外观模式定义了一个高层接口,使得子系统更易于使用。

外观模式的作用

简化接口:为复杂的子系统提供一个简单的接口,使得客户端代码更易于使用。

降低耦合度:客户端只需要与外观类交互,而不需要了解子系统的复杂性。

提高可维护性:当子系统发生变化时,只需要修改外观类,而不需要修改客户端代码。

外观模式应用场景

1.复杂系统的简化:当一个系统有多个复杂的子系统时,可以使用外观模式提供一个简单的接口。

2.遗留系统的集成:在集成遗留系统时,可以使用外观模式提供一个简单的接口。

3.多层架构:在多层架构中,可以使用外观模式提供不同层之间的简单接口。

Go 语言实现外观模式的示例

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()
}