10. 外观模式(Facade)
10. 外观模式(Facade)
问题:子系统接口复杂,调用者不想了解内部细节。
核心:提供一个高层简化接口,内部协调子系统。
class Projector {
on() { console.log('投影仪开机'); }
setInput() { console.log('切换到 HDMI'); }
}
class SoundSystem {
on() { console.log('音响开机'); }
setVolume(v) { console.log(`音量设为 ${v}`); }
}
class Lights {
dim() { console.log('灯光调暗'); }
}
// 外观
class HomeTheaterFacade {
#projector = new Projector();
#sound = new SoundSystem();
#lights = new Lights();
watchMovie() {
this.#lights.dim();
this.#projector.on();
this.#projector.setInput();
this.#sound.on();
this.#sound.setVolume(50);
}
}
const theater = new HomeTheaterFacade();
theater.watchMovie();package facade
import "fmt"
type Projector struct{}
func (p Projector) On() { fmt.Println("投影仪开机") }
func (p Projector) SetInput() { fmt.Println("切换到 HDMI") }
type SoundSystem struct{}
func (s SoundSystem) On() { fmt.Println("音响开机") }
func (s SoundSystem) SetVolume(v int) { fmt.Printf("音量设为 %d\n", v) }
type Lights struct{}
func (l Lights) Dim() { fmt.Println("灯光调暗") }
type HomeTheaterFacade struct {
projector Projector
sound SoundSystem
lights Lights
}
func NewHomeTheaterFacade() *HomeTheaterFacade {
return &HomeTheaterFacade{}
}
func (f *HomeTheaterFacade) WatchMovie() {
f.lights.Dim()
f.projector.On()
f.projector.SetInput()
f.sound.On()
f.sound.SetVolume(50)
}