当前位置: 首页 > news >正文

设计模式中的行为模式

行为型设计模式主要关注对象间的职责分配和算法抽象,以下是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等大量融合这些模式思想,理解其本质比记忆实现更重要。

http://www.dtcms.com/a/319238.html

相关文章:

  • sqli-labs-master/Less-41~Less-50
  • 论文Review 激光实时动态物体剔除 DUFOMap | KTH出品!RAL2024!| 不上感知,激光的动态物体在线剔除还能有什么方法?
  • DrissionPage自动化:高效Web操作新选择
  • 【人工智能99问】NLP(自然语言处理)大模型有哪些?(20/99)
  • 【多重BFS】Monsters
  • 调用阿里云-阿里云百炼 AI
  • 表驱动法-灵活编程范式
  • Java 中 Object 类的解析:知识点与注意事项
  • Oracle参数Process
  • 深度学习的视觉惯性里程计(VIO)算法优化实践
  • PCB制造中压接孔、插接孔、沉头孔、台阶孔的区别及生产流程
  • [Oracle] MOD()函数
  • 数据库入门:从零开始构建你的第一个数据库
  • idea工具maven下载报错:PKIX path building failed,配置忽略SSL检查
  • [Oracle] CEIL()函数
  • 无人机航拍数据集|第7期 无人机绵羊红外目标检测YOLO数据集1964张yolov11/yolov8/yolov5可训练
  • 计算虚拟化技术
  • vscode.window.activeTextEditor 获取不到 png 图片路径问题
  • 僵尸进程问题排查
  • Github创建仓库,克隆提交代码到远程
  • 内存泄漏系列专题分析之三十二:高通相机CamX ION/dmabuf内存管理机制CmdBuffer
  • 【3D图像技术分析与实现】谷歌的AlphaEarth是如何实现的?
  • 鸿蒙RichEditor
  • 使用萤石云播放视频及主题模版配置
  • python安装部署rknn-toolkit2(ModuleNotFoundError: No module named ‘rknn_toolkit2‘)
  • 技术速递|Copilot Coding Agent:自定义设置步骤更可靠、更易于调试
  • P8250 交友问题
  • 表单元素与美化技巧:打造用户友好的交互体验
  • zookeeper因jute.maxbuffer启动异常问题排查处理
  • 如何开发一个运行在windows系统服务器上的服务