Golang学习笔记_34——组合模式
Golang学习笔记_35——代理模式
Golang学习笔记_36——装饰器模式
文章目录
外观模式(Facade Pattern)详解
一、核心概念
1. 定义
外观模式是一种结构型设计模式,通过为复杂子系统提供一个统一的高层接口,降低客户端与子系统的耦合度,使得子系统更易使用。
2. 解决的问题
- 简化复杂系统调用:隐藏子系统交互细节,提供简洁入口
- 降低耦合度:客户端仅依赖外观类,而非多个子系统
- 分层系统结构:定义系统入口点,便于维护和扩展
3. 核心角色
- Facade(外观类)
整合多个子系统功能,提供简化接口(如StartComputer()
) - 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. 计算机启动流程
- 子系统: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()
}
六、与其他模式对比
模式 | 核心目标 | 关键区别 |
---|---|---|
中介者 | 对象间交互解耦 | 集中控制多个对象通信 |
适配器 | 接口转换 | 解决已有接口不匹配问题 |
单例 | 控制实例数量 | 确保全局唯一访问点 |
七、总结
外观模式通过封装复杂子系统,实现了:
- 简化接口:客户端调用复杂度显著降低
- 解耦设计:隔离变化,提升系统可维护性
- 灵活扩展:支持多层外观和子系统自由组合
在Go语言中实现时需注意:
- 合理划分子系统职责
- 避免外观类过度膨胀
- 权衡直接访问子系统与通过外观访问的边界