设计模式中的行为模式
行为型设计模式主要关注对象间的职责分配和算法抽象,以下是11种经典行为模式及其典型应用场景的详细解析:
1. 责任链模式(Chain of Responsibility)
核心思想:将请求沿处理链传递,直到有对象处理它
应用场景:
多级审批系统(如费用报销流程)
事件冒泡机制(浏览器DOM事件)
日志过滤器链(Log4j的Appender过滤)
典型案例:
public interface Handler {void setNext(Handler h);boolean handle(Request req);
}
// 构建链:spamHandler -> fanHandler -> complaintHandler
2. 命令模式(Command)
核心思想:将请求封装为独立对象,支持撤销/重做
应用场景:
图形编辑器撤销栈(Photoshop历史记录)
智能家居遥控器(同一按钮绑定不同设备)
事务型系统(数据库回滚操作)
实现要点:
class Command:def execute(self): passdef undo(self): passclass LightOnCommand(Command):def __init__(self, light):self._light = lightdef execute(self):self._light.turn_on()
3. 解释器模式(Interpreter)
核心思想:定义语言的文法表示,并解释执行
应用场景:
正则表达式引擎
SQL语法解析(MySQL的WHERE子句处理)
金融规则引
4. 迭代器模式(Iterator)
核心思想:提供统一的集合遍历接口
应用场景:
数据库查询结果集遍历(JDBC ResultSet)
树形结构遍历(文件系统目录导航)
自定义集合类(C++ STL迭代器实现)
现代演进:
// ES6迭代器协议
const myIterable = {[Symbol.iterator]() {let step = 0;return {next() {return step <= 3 ? {value: step++, done: false} : {done: true};}};}
};
5. 中介者模式(Mediator)
核心思想:通过中介对象集中管理对象间交互
应用场景:
航空管制系统(协调多架飞机起降)
GUI组件通信(Qt的信号槽机制)
微服务编排(Kubernetes Pod调度)
优势对比:
直接通信 中介者模式
N*(N-1)连接复杂度 线性复杂度
对象强耦合 对象仅依赖中介
6. 备忘录模式(Memento)
核心思想:捕获对象内部状态并在需要时恢复
应用场景:
游戏存档系统(保存角色状态)
文本编辑器撤销操作(VSCode的CTRL+Z)
虚拟机快照(VMware snapshot)
实现注意:
// 严格封装备忘录
class Originator {private string _state;public Memento Save() => new Memento(_state);internal void Restore(Memento m) => _state = m.GetState();
}// 备忘录类不公开构造函数
public sealed class Memento {private readonly string _state;internal Memento(string s) => _state = s;internal string GetState() => _state;
}
7. 观察者模式(Observer)
核心思想:定义对象间的一对多依赖关系
应用场景:
股票价格变动通知(Bloomberg终端)
React/Vue响应式数据绑定
传感器数据监控(IoT设备群)
现代实现:
// RxJS观察者模式变体
const stockTicker$ = new Subject<number>();
stockTicker$.subscribe(price => {console.log(`当前股价: ${price}`);
});
stockTicker$.next(156.78);
8. 状态模式(State)
核心思想:将对象行为委托给状态对象
应用场景:
电梯控制系统(运行/停止/维护状态)
TCP连接状态机(SYN_SENT/ESTABLISHED)
游戏AI角色行为(巡逻/追击/逃跑)
模式优化:
// 使用状态机生成器避免条件分支
type State interface {Handle(ctx *Context)
}type Context struct {state State
}
func (c *Context) Request() {c.state.Handle(c)
}
9. 策略模式(Strategy)
核心思想:定义算法族并使其可互换
应用场景:
支付方式选择(支付宝/微信/信用卡)
导航路径计算(最短路径/最少收费)
数据压缩算法(ZIP/LZ77/Snappy)
Lambda演进:
// 传统实现
interface SortStrategy {void sort(List<?> items);
}// Java8+函数式表达
Collections.sort(list, (a,b) -> b.compareTo(a));
10. 模板方法模式(Template Method)
核心思想:定义算法骨架,允许子步骤重写
应用场景:
自动化测试框架(setUp/test/tearDown)
银行交易流程(验证/执行/记录)
编译器设计(词法分析→语法分析→代码生成)
钩子方法:
class DatabaseTemplate:def connect(self): raise NotImplementedErrordef query(self): pass # 默认实现def close(self): print("Default close")def execute(self): # 模板方法self.connect()self.query()self.close()
11. 访问者模式(Visitor)
核心思想:将操作与对象结构分离
应用场景:
编译器AST遍历(类型检查/代码优化)
文档格式转换(Markdown→HTML/PDF)
医疗影像处理(CT/MRI不同分析算法)
双重分发:
class Element {
public:virtual void accept(Visitor& v) = 0;
};class Visitor {
public:void visit(ElementA& e);void visit(ElementB& e);
};
行为模式选择矩阵
问题特征 推荐模式
需要撤销/重做操作 命令模式
对象状态决定行为 状态模式
跨组件通信复杂 中介者模式
多种算法灵活切换 策略模式
遍历异构集合 迭代器模式
解耦事件发布订阅 观察者模式
行为模式通过将行为抽象化和通信规范化,有效解决了面向对象设计中高频出现的职责分配问题。现代框架如Spring、React等大量融合这些模式思想,理解其本质比记忆实现更重要。