Golang学习笔记_37——外观模式

发布于:2025-02-26 ⋅ 阅读:(12) ⋅ 点赞:(0)

Golang学习笔记_34——组合模式
Golang学习笔记_35——代理模式
Golang学习笔记_36——装饰器模式



外观模式(Facade Pattern)详解

一、核心概念

1. 定义

外观模式是一种结构型设计模式,通过为复杂子系统提供一个统一的高层接口,降低客户端与子系统的耦合度,使得子系统更易使用。

2. 解决的问题
  • 简化复杂系统调用:隐藏子系统交互细节,提供简洁入口
  • 降低耦合度:客户端仅依赖外观类,而非多个子系统
  • 分层系统结构:定义系统入口点,便于维护和扩展
3. 核心角色
  1. Facade(外观类)
    整合多个子系统功能,提供简化接口(如StartComputer()
  2. Subsystem Classes(子系统类)
    实现具体功能模块(如CPU、内存、硬盘)
4. 类图

外观模式类图

@startuml
class Facade {
    - subsystemA: SubsystemA
    - subsystemB: SubsystemB
    + operation(): void
}

class SubsystemA {
    + operationA(): void
}

class SubsystemB {
    + operationB(): void
}

Facade --> SubsystemA
Facade --> SubsystemB
@enduml

二、特点分析

优点

  1. 简化客户端调用:隐藏复杂逻辑,调用链从多次变为一次
  2. 解耦客户端与子系统:修改子系统不影响客户端
  3. 灵活访问方式:客户端仍可直接调用子系统(非强制)

缺点

  1. 过度设计风险:简单系统增加外观类反而冗余
  2. 违反开闭原则:子系统变更可能导致外观类修改

三、适用场景

1. 计算机启动流程
  • 子系统:CPU自检、内存初始化、硬盘加载
  • 外观接口StartComputer()封装启动步骤
2. 电商下单系统
  • 子系统:库存校验、支付处理、物流通知
  • 外观接口PlaceOrder()整合下单流程
3. 智能家居控制
  • 子系统:灯光调节、空调控制、安防系统
  • 外观接口LeaveHomeMode()一键关闭所有设备

四、代码示例(Go语言)

示例类图

package facade_demo

// 子系统 CPU
type CPU struct {
}

func (c *CPU) Start() {
   println("CPU Start")
}

// 子系统内存
type Memory struct {
}

func (m *Memory) Start() {
   println("Memory Start")
}

// 子系统硬盘
type HardDisk struct {
}

func (h *HardDisk) Start() {
   println("HardDisk Start")
}

// 外观类
type ComputerFacade struct {
   cpu    *CPU
   memory *Memory
   hard   *HardDisk
}

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

func (c *ComputerFacade) Start() {
   c.cpu.Start()
   c.memory.Start()
   c.hard.Start()
}

func test() {
   computer := NewComputerFacade()
   computer.Start()
}

输出结果:

=== RUN   Test_test
CPU Start
Memory Start
HardDisk Start
--- PASS: Test_test (0.00s)
PASS

五、高级应用

1. 与单例模式结合
var instance *ComputerFacade
var once sync.Once

func GetComputerFacade() *ComputerFacade {
    once.Do(func() {
        instance = NewComputerFacade()
    })
    return instance
}
2. 分层外观设计
type AdvancedFacade struct {
    basicFacade *ComputerFacade
    network     *Network
}

func (af *AdvancedFacade) StartWithNetwork() {
    af.basicFacade.Start()
    af.network.Connect()
}

六、与其他模式对比

模式 核心目标 关键区别
中介者 对象间交互解耦 集中控制多个对象通信
适配器 接口转换 解决已有接口不匹配问题
单例 控制实例数量 确保全局唯一访问点

七、总结

外观模式通过封装复杂子系统,实现了:

  1. 简化接口:客户端调用复杂度显著降低
  2. 解耦设计:隔离变化,提升系统可维护性
  3. 灵活扩展:支持多层外观和子系统自由组合

在Go语言中实现时需注意:

  • 合理划分子系统职责
  • 避免外观类过度膨胀
  • 权衡直接访问子系统与通过外观访问的边界

网站公告

今日签到

点亮在社区的每一天
去签到