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