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: 恋水无意
腾讯云开发者社区:孟斯特