设计模式---行为型模式(一)

设计模式——行为型模式(一) 黑马设计模式 阅读详情

责任链模式(Chain of Responsibility Pattern)

概念

责任链模式是一种行为型设计模式,它将请求的发送者和接收者解耦,让多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

通俗理解:就像公司的审批流程,员工提交报销申请后,会依次经过组长 → 经理 → 总监 → 财务,每一级都有自己的审批权限,超出权限就传递给下一级。

核心角色

  • Handler(抽象处理者):定义处理请求的接口,包含下一个处理者的引用
  • ConcreteHandler(具体处理者):实现处理请求的具体逻辑,如果自己不能处理则传递给下一个处理者
  • Client(客户端):创建责任链并发起请求

核心思想

让复杂的业务流程变得像搭积木一样灵活,可以根据不同场景组装不同的链条。核心优势在于:

  • 解耦:请求发送者不需要知道谁会处理请求
  • 灵活:可以动态增加、删除、调整处理节点
  • 单一职责:每个处理者只关注自己的处理逻辑

实际应用场景

场景1:订单校验流程

在电商系统中,订单提交后需要经过多重校验:

订单请求 → 库存校验 → 优惠券校验 → 风控校验 → 支付校验 → 提交成功

传统方式的问题:

public void submitOrder(Order order) {
    // 所有校验逻辑耦合在一起
    if (!checkStock(order)) return;
    if (!checkCoupon(order)) return;
    if (!checkRisk(order)) return;
    if (!checkPayment(order)) return;
    // 如果要新增"黑名单校验",必须修改这里的代码
}

使用责任链模式:

// 只需新增一个黑名单校验处理器
BlacklistHandler blacklistHandler = new BlacklistHandler();
// 将其插入责任链中
stockHandler.setNext(couponHandler)
            .setNext(blacklistHandler)  // 新增节点
            .setNext(riskHandler)
            .setNext(paymentHandler);

场景2:动态配置责任链

不同促销活动需要不同的校验流程:

  • 618活动:库存校验 → 优惠券校验 → 风控校验 → 支付校验
  • 双十一活动:库存校验 → 优惠券校验 → 风控校验 → 黑名单校验 → 支付校验

通过配置文件或数据库动态组装责任链,无需修改代码即可适应不同业务场景。

优缺点

优点:

  • 降低耦合度,请求发送者和接收者解耦
  • 增强了给对象指派职责的灵活性
  • 符合开闭原则,新增处理者无需修改原有代码

缺点:

  • 请求可能得不到处理(链条末端没有处理)
  • 性能问题,请求可能需要遍历整条链
  • 调试不方便,需要跟踪整条链路

命令模式(Command Pattern)

概念

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

通俗理解:把"做某件事"这个动作本身变成一个对象,这样就可以像操作普通对象一样操作这个动作。

核心角色

  • Command(命令接口):定义执行操作的接口
  • ConcreteCommand(具体命令):实现命令接口,持有接收者对象
  • Receiver(接收者):真正执行业务逻辑的对象
  • Invoker(调用者):持有命令对象,负责调用命令
  • Client(客户端):创建具体命令对象并设置接收者

核心思想

把"动词"变成"名词"的过程,这是命令模式最精髓的理解:

  • 动词(方法):只能被调用,调用完就消失了,无法控制
  • 名词(对象):可以被传递、存储、修改、组合、撤销

通过将行为对象化,我们获得了对行为的控制能力,实现了创建和执行的解耦。

生动的案例:餐厅点餐系统

场景对比:

方式1:直接沟通(没有命令模式)

顾客A对厨师说:"来一碗面"
顾客B对厨师说:"来一碗饭"

问题:

  • 只能按时间顺序执行
  • 无法撤销订单
  • 无法调整优先级
  • 无法记录历史
  • 厨师必须记住所有订单

方式2:订单纸条(使用命令模式)

顾客A写纸条:"一碗面" → 交给服务员
顾客B写纸条:"一碗饭" → 交给服务员
服务员将纸条按顺序交给厨师

优势:

  • ✅ 可以撤销:顾客反悔,撕掉纸条即可
  • ✅ 可以加急:VIP订单插队
  • ✅ 可以修改:改菜品只需换纸条
  • ✅ 可以对账:纸条就是凭证
  • ✅ 可以排队:服务员统一管理订单

这就是将创建和执行解耦的威力!

代码示例

// 命令接口
interface Command {
    void execute();
    void undo();
}

// 具体命令
class OrderCommand implements Command {
    private Chef chef;  // 接收者
    private String dish;
    
    public void execute() {
        chef.cook(dish);
    }
    
    public void undo() {
        chef.cancel(dish);
    }
}

// 调用者(服务员)
class Waiter {
    private List<Command> orders = new ArrayList<>();
    
    public void takeOrder(Command command) {
        orders.add(command);
    }
    
    public void submitOrders() {
        for (Command order : orders) {
            order.execute();
        }
    }
}

实际应用场景

  1. 文本编辑器的撤销/重做功能
  2. 事务管理系统
  3. 任务队列和调度系统
  4. 宏命令(批量操作)
  5. 日志记录和审计

优缺点

优点:

  • 解耦调用者和接收者
  • 容易扩展新命令
  • 可以实现撤销/重做
  • 可以组合命令(宏命令)

缺点:

  • 可能产生大量具体命令类
  • 增加了系统复杂度

迭代器模式(Iterator Pattern)

概念

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。简单来说,就是提供一种统一的方式来遍历不同的集合结构。

通俗理解:就像遥控器,不管是电视、空调还是音响,都用同样的方式操作(上一个、下一个),不需要知道内部是怎么工作的。

核心思想

把复杂的遍历逻辑藏起来,给使用者一个简单统一的接口。让集合的遍历方式与集合的内部结构解耦。

核心角色

  • Iterator(迭代器接口):定义访问和遍历元素的接口(hasNext、next等)
  • ConcreteIterator(具体迭代器):实现迭代器接口,跟踪遍历的当前位置
  • Aggregate(聚合接口):定义创建迭代器对象的接口
  • ConcreteAggregate(具体聚合):实现创建相应迭代器的接口,返回具体迭代器实例

为什么需要迭代器模式

问题场景:

// 遍历数组
for (int i = 0; i < array.length; i++) {
    process(array[i]);
}

// 遍历链表
Node current = head;
while (current != null) {
    process(current.data);
    current = current.next;
}

// 遍历树(需要递归或栈)
// 更复杂...

每种数据结构的遍历方式都不同,使用者需要了解内部结构,代码难以复用。

使用迭代器模式:

// 统一的遍历方式
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
    process(iterator.next());
}

实际应用

Java中最常见的就是Iterator接口:

List<String> list = new ArrayList<>();
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

// 或者使用增强for循环(底层也是迭代器)
for (String item : list) {
    System.out.println(item);
}

优缺点

优点:

  • 支持以不同方式遍历一个聚合对象
  • 简化了聚合类的接口
  • 可以同时进行多个遍历
  • 符合单一职责原则

缺点:

  • 对于简单的集合,使用迭代器可能比较繁琐
  • 增加了系统复杂度
SPSS回归分析(线性:一元(简单)和多重;非线性logistic) SPSS线性回归分析回归分析一、线性模型(针对连续因变量,线性关系)(一)简单线性回归(一元线性回归)1、绘制散点图2、建立简单(一元)线性回归模型3、建立模型后,检查预测结果(二)多重回归分析1、绘制矩阵分布散点图(论文专用你懂的)2、建立多重回归模型point 1:自变量加入方法:逐步(步进)法3、建立模型后,检查预测结果二、非线性模型(将非线性问题转换为线性问题)1、logistic分析的回归模型1.1 建立回归模型1.2 利用回归模型进行预测 根据之前的学习,通过评价实验得到了主观数据, 通过 描述 阅读详情

相关推荐

别再手动写用例了!用AI Agent自动生成测试用例的保姆级实战(附Python代码)

本文详细介绍了如何利用AI Agent技术自动生成测试用例,大幅提升测试工程师的工作效率。通过Python代码实战演示,从环境搭建到核心Agent构建(需求解析、场景挖掘、用例编排),再到与企业工具链(TestRail、Jira)的深度集成,帮助团队实现测试用例的智能化生成与管理。

weixin_30897233的博客 648

Java设计模式之行为型模式一

本章是关于设计模式的最后一讲,会讲到第三种设计模式——行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 先来张图,看看这11中模式的关系: 第一类:通过父类与子类的关系进行实现。 第二类:两个类之间。 第三类:类的状态。 第四类:通过中间类 1、策略模式(strategy)

swimming_in_IT_的博客 666

手把手教你用Trae配置Python开发环境(含Claude 3.5代码生成实战)

本文详细介绍了如何使用字节跳动推出的Trae智能开发环境配置Python开发环境,并实战演示了Claude 3.5代码生成功能。从环境准备到项目初始化,再到AI辅助编码和调试优化,全面展示了Trae在提升开发效率方面的强大能力,特别适合Python开发者快速搭建项目和解决复杂问题。

weixin_28309571的博客 977

设计模式之——行为型模式一

​【1】引入        常见行为型模式有11种:职责链、命令、解释器、迭代、中介者、备忘录,观察者、状态、策略、模版方法、访问者。这里先介绍一部分。 【2】单个模式简介 一:观察者模式:             定义对象之间的一种一对一或者一对多的依赖关系,也就是行为上产生某种依赖关系,分离了目标和观察者。当一个对象(即目标)的状态发生改变时,

keep innocent 1438

sylar学习系列一

开发环境 Centos7最小系统 gcc 9.1 cmake 环境可能存在的一些问题 可能存在的问题,linux最小系统没有一些常用命令,如果我们处于外网我们可以yum安装,但却遇到以下问题 can not find a valid baseurl for repo: base/7/x86-64 可修改网络配置 vi /etc/sysconfig/network-scripts/ifcfg-ens123 # 不是每个主机都是ens123 把ONBOOT=no,改为ONBOOT=yes 重启网络

wuguinianjing的博客 1019

从零到一:用Python打造你的智能交互桌宠,附完整源码与打包指南

本文详细介绍了如何从零开始使用Python开发智能交互桌宠,涵盖环境配置、窗口创建、动图加载、交互功能实现及打包发布全流程。教程特别适合零基础开发者,通过完整源码和分步指南,帮助读者快速掌握桌面宠物开发技巧,打造个性化AI伴侣。

weixin_29094539的博客 293

一文学会设计模式之行为型模式及最佳实现

本文将详细介绍11种行为型模式,包括策略、模板方法、观察者、迭代器、命令、状态、责任链、备忘录、解释器、访问者和中介者模式。

weixin_36389889的博客 821

RobotStudio码垛机器人创建过程

首先导入一个IRB2600机器人,移动夹具的本地坐标原点,使原点位置为顶面中心(与法兰盘连接的部位)。对齐夹爪Smart组件的本地坐标和机器人末端法兰盘的坐标...

个人博客 1万+

设计模式之“行为型模式”(一)

观察者模式     定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 一、适用时期     1、当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变,应该考虑使用观察者模式。     2、当一个观察者模型有两个方面,其中一方面依赖于另一方面,这时使

郑颖的优快云 2014

华为OD机试双机位C卷:流量波峰 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷 流量波峰,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 流量波峰。

qq_45776114的博客 2447

Wazuh部署记录

Wazuh是一个免费的开源安全平台,统一了XDR和SIEM功能。它可以保护内部部署、虚拟化、容器化和基于云的环境中的工作负载。Wazuh帮助组织和个人保护其数据资产免受安全威胁。它被全球数千个组织广泛使用,从小型企业到大型企业。443:仪表盘界面访问端口1515:探针连接服务器端口1514:探针回传信息端口以上3个端口必须打开防火墙。

墨痕诉清风的博客 1562

设计模式之行为型模式一

行为型模式: 观察者模式     定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.     观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了变化,所有的Observe

何静媛 1874

用长tree方式做等长线

1)写一个sdc,把等长线的起点设置成clock source,用于创建create_clock,至于period和waveform等参数随便写即可。然后clock_opt -from build_clock -to route_clock即可。3)在正式cts之前或之后,给自己创建的scenario长tree并don't touch。前面讲过了如何用set_data_check做等长线,这里再讲一下如何用cts的方式做。2)为该clock创建一个新mode,并创建对应的scenario。

m0_61544122的博客 623

GOF 23设计模式之(行为型模式一)

目录 1.模板方法模式 2.策略模式 3.命令模式 4.职责链模式 一、模板方法模式(Template Method)      定义操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。即:处理步骤父类中定义好,具体实现延迟到子类中定义。   &nbsp...

HC_JAVA崽 278

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式-行为型模式(一)

设计模式-行为型模式(一)

Eriksen的博客 274

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java设计模式之行为型模式(一)

这里我们要了解的行为型模式分别是策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式等11中模式。

蛾子 491

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【面向对象】——设计模式之行为型模式(一)

行为型模式包括:观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。 这篇,介绍的是:观察者模式、模板方法模式、命令模式、状态模式、职责链模式。 观察者模式: 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自己更新自己。 什

相由心生-心随相改~ 1611

设计模式之行为型模式(一)

设计模式被分成了三大类型:创建型、结构型和行为型。本文介绍一下行为型模式中的观察者模式、模板方法模式、命令模式、状态模式和职责链模式。 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 优点:观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。从而使得各自的变化都不会影响另一边的变化。 缺点:依

当他回首往事时,不应为虚度年华而后悔,也不会因为碌碌无为而羞耻。 995

设计模式

GoF在Design Pattern:Elements of Reusable Objected-Oriented Sofeware中讲到了23中设计模式,并将它们分为三类: 创建型模式 结构型模式 行为型模式 待补充。。。 ...

flyerooo的博客 139

【设计模式】——行为型(一)

观察者模式模板模式命令模式状态模式职责链模式

张文慧 期待每一天更好的自己 282

Java经典23种设计模式之行为型模式(一)

行为型设计模式有11种,分别是

yanzi1225627的专栏 3962

Php设计模式:行为型模式(一)

在上一篇我们讲了结构型模式,结构型模式是讨论类和对象的结构的。总共有7种。而今天我们来介绍一下行为型模式。 一、什么是行为型模式? 1、设计模式:           是一套被反复使用、多数人知晓的、经过分类编目的、代码设计的总结。就好像杯子,是被前人设计出来的,实现了储存水的功能,解决了人们的喝水问题。大多数人喝水都用杯子。但是你不必自己再重做另外方法再做一种容器,而实现的也是同样的功能,

bianbiancheng的专栏 820
上一篇: 创造者模式
下一篇: 设计模式---行为型模式(二)
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值