1. 基本概念

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化系统接口的高层接口,使得系统更易于使用。外观模式定义了一个高层接口,这个接口隐藏了系统中多个子系统的复杂性,为客户端提供了一个简化的入口点。

2. 适用场景

  • 当一个复杂系统中有多个子系统,而客户端只关心与系统的一个高层接口交互时。
  • 当需要简化一个复杂系统的接口,提供一个更易用的接口供外部使用时。
  • 当需要对系统的接口进行封装,隔离客户端和系统的具体实现细节时。

3. 优缺点

优点:

  • 简化接口: 外观模式通过提供一个简化的高层接口,隐藏了系统的复杂性,使得客户端更容易使用。
  • 松耦合: 外观模式降低了客户端与系统之间的耦合度,客户端只需要与外观接口交互,而不需要了解系统的具体实现。
  • 提高可维护性: 外观模式将系统的实现细节封装在一个接口后,更容易维护和修改系统的实现。

缺点:

  • 不符合开闭原则: 如果系统的接口发生变化,可能需要修改外观类,这违反了开闭原则(对扩展开放,对修改关闭)。

4. 示例

考虑一个计算机启动的例子。在一个计算机启动的过程中,涉及到多个子系统的初始化,例如 CPU、内存、硬盘等。使用外观模式可以封装这些子系统的初始化过程,为客户端提供一个简化的接口。

package main

import "fmt"

// Subsystem1
type CPU struct{}

func (c *CPU) Start() {
	fmt.Println("CPU is starting")
}

// Subsystem2
type Memory struct{}

func (m *Memory) Load() {
	fmt.Println("Memory is loading")
}

// Subsystem3
type HardDrive struct{}

func (h *HardDrive) Read() {
	fmt.Println("Hard Drive is reading")
}

// Facade
type ComputerFacade struct {
	cpu       *CPU
	memory    *Memory
	hardDrive *HardDrive
}

func NewComputerFacade() *ComputerFacade {
	return &ComputerFacade{
		cpu:       &CPU{},
		memory:    &Memory{},
		hardDrive: &HardDrive{},
	}
}

func (f *ComputerFacade) Start() {
	fmt.Println("Computer is starting...")
	f.cpu.Start()
	f.memory.Load()
	f.hardDrive.Read()
	fmt.Println("Computer is started")
}

// Client
func main() {
	computer := NewComputerFacade()
	computer.Start()
}

在这个示例中,ComputerFacade 封装了启动计算机所需的多个子系统,包括 CPU、Memory、HardDrive。客户端只需要与 ComputerFacade 交互,而无需了解启动过程中各个子系统的具体细节。这样简化了客户端的使用,同时提高了系统的可维护性。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特