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

行为型设计模式(二) 行为型设计模式(二)命令模式(Command)核心示例一:自由化创建视图示例二:绘图命令访问者模式(Visitor)核心示例一:IE 兼容示例二:操作类数组对象中介者(Mediator)核心示例一:导航设置功能备忘录模式(Memento)核心示例一:网络请求数据的缓存迭代器模式(Iterator)核心示例一:简化循环遍历示例二:数组/对象迭代器示例三:同步变量迭代器示例四:分支循环嵌套问题解释器模式(Iterpreter)核心示例一:统计元素路径 用于不同 对象间 职责划分或算法抽象 命令模式(Comm 阅读详情

中介者模式(Mediator Pattern)

概念

中介者模式是一种行为型设计模式,它通过引入一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而降低耦合度。

通俗理解:就像房产中介,买家和卖家不直接联系,都通过中介沟通。中介负责协调双方,处理复杂的交互逻辑。

核心思想

将"做事"和"协调"分离的艺术,让复杂的交互变得简单、可控。

  • 同事对象:专注自己的业务能力(做事)
  • 中介者:负责编排和协调(指挥)

核心角色

  • Mediator(抽象中介者):定义与各同事对象通信的接口
  • ConcreteMediator(具体中介者):协调各同事对象实现协作行为,了解并维护各同事对象
  • Colleague(抽象同事类):持有中介者引用
  • ConcreteColleague(具体同事类):通过中介者与其他同事通信,不直接引用其他同事

问题场景:对象间的网状依赖

没有中介者的情况:

订单服务 ←→ 库存服务
   ↕          ↕
支付服务 ←→ 通知服务

每个服务都要知道其他服务,形成网状依赖,耦合度高,难以维护。

使用中介者模式:

        中介者
       ↙ ↓ ↓ ↘
订单 库存 支付 通知

所有服务只与中介者通信,形成星型结构,耦合度低。

实际案例:电商下单流程

业务流程:

创建订单 → 扣减库存 → 创建支付单 → 发送通知

传统方式的问题:

class OrderService {
    private StockService stockService;
    private PaymentService paymentService;
    private NotificationService notificationService;
    
    public void createOrder(Order order) {
        // 创建订单
        saveOrder(order);
        
        // 调用库存服务
        stockService.deduct(order);
        
        // 调用支付服务
        paymentService.createPayment(order);
        
        // 调用通知服务
        notificationService.send(order);
        
        // 如果任何环节失败,回滚逻辑分散在各处,容易出错
    }
}

使用中介者模式:

class OrderMediator {
    private OrderService orderService;
    private StockService stockService;
    private PaymentService paymentService;
    private NotificationService notificationService;
    
    public void processOrder(Order order) {
        try {
            // 协调各服务按顺序执行
            orderService.create(order);
            stockService.deduct(order);
            paymentService.createPayment(order);
            notificationService.send(order);
        } catch (Exception e) {
            // 集中处理回滚逻辑
            rollback(order);
        }
    }
    
    private void rollback(Order order) {
        // 统一的回滚协调逻辑
        notificationService.cancelNotification(order);
        paymentService.cancelPayment(order);
        stockService.restore(order);
        orderService.cancel(order);
    }
}

优势

  • 降低耦合:各同事对象不需要相互引用
  • 集中控制:交互逻辑集中在中介者,易于理解和维护
  • 简化对象:同事对象不需要知道复杂的交互逻辑
  • 易于扩展:新增同事对象只需修改中介者

缺点

  • 中介者可能变得非常复杂,成为"上帝类"
  • 中介者本身可能成为性能瓶颈

适用场景

  • 对象之间存在复杂的引用关系,导致依赖混乱
  • 想通过一个中间类来封装多个类的行为
  • 想要复用一个对象,但该对象与其他对象紧密耦合

备忘录模式(Memento Pattern)

概念

备忘录模式是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,以便在将来某个时刻恢复到该状态。

通俗理解:就像游戏的存档功能,可以随时保存当前进度,打不过BOSS时可以读档重来。

核心思想

给对象拍快照,需要时可以回滚。关键是在保存状态的同时,不破坏对象的封装性。

核心角色

  • Originator(发起人):需要保存状态的对象,可以创建备忘录并恢复状态
  • Memento(备忘录):存储发起人的内部状态,只有发起人能访问备忘录的内部状态
  • Caretaker(管理者):负责保存备忘录,但不能修改或查看备忘录的内容

实际应用场景

1. 文本编辑器的撤销功能

class TextEditor {
    private String content;
    
    // 创建备忘录
    public Memento save() {
        return new Memento(content);
    }
    
    // 恢复状态
    public void restore(Memento memento) {
        this.content = memento.getContent();
    }
}

// 使用
TextEditor editor = new TextEditor();
editor.write("Hello");
Memento save1 = editor.save();  // 保存状态

editor.write(" World");
Memento save2 = editor.save();

editor.restore(save1);  // 撤销到"Hello"

2. 数据库事务
3. 浏览器的后退功能
4. 游戏存档系统

优缺点

优点:

  • 提供了状态恢复机制
  • 保持了封装性,不暴露对象内部细节
  • 简化了发起人类,状态管理由管理者负责

缺点:

  • 消耗资源,每次保存都需要创建备忘录对象
  • 如果状态数据很大,会占用大量内存

注意事项

  • 备忘录对象应该是不可变的(Immutable)
  • 考虑使用原型模式来创建备忘录
  • 可以设置备忘录数量上限,避免内存溢出

观察者模式(Observer Pattern)

概念

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系。当一个对象(被观察者/主题)的状态发生改变时,所有依赖于它的对象(观察者)都会得到通知并自动更新。

通俗理解:就像订阅公众号,你关注了某个公众号(被观察者),当它发布新文章时,所有关注者(观察者)都会收到推送通知。

核心思想

建立一种"订阅-发布"的依赖关系,让对象之间的通信从"主动调用"变成"被动通知"。

关键转变:

  • 传统方式:A主动调用B、C、D(A需要知道B、C、D的存在)
  • 观察者模式:A发布事件,B、C、D自动收到通知(A不需要知道谁在监听)

核心角色

  • Subject(主题/被观察者):维护观察者列表,提供注册、移除、通知观察者的方法
  • Observer(观察者):定义更新接口,当收到通知时执行相应操作
  • ConcreteSubject(具体主题):存储状态,状态改变时通知所有观察者
  • ConcreteObserver(具体观察者):实现更新接口,保持与主题状态的一致

代码对比

没有观察者模式 - 紧耦合:

public class OrderService {
    private EmailService emailService;
    private SmsService smsService;
    private PointsService pointsService;
    
    public void createOrder(Order order) {
        // 保存订单
        orderRepository.save(order);
        
        // 主动调用各个服务 - 强依赖
        emailService.sendEmail(order);
        smsService.sendSms(order);
        pointsService.addPoints(order);
        
        // 如果要加新功能(如推送通知),必须修改这里
        // pushService.push(order);  // 违反开闭原则
    }
}

使用观察者模式 - 解耦:

public class OrderService {
    private List<OrderObserver> observers = new ArrayList<>();
    
    public void addObserver(OrderObserver observer) {
        observers.add(observer);
    }
    
    public void createOrder(Order order) {
        orderRepository.save(order);
        // 只负责通知,不关心谁在监听
        notifyObservers(order);
    }
    
    private void notifyObservers(Order order) {
        for (OrderObserver observer : observers) {
            observer.update(order);
        }
    }
}

// 新增功能只需要注册新的观察者,无需修改OrderService
orderService.addObserver(new EmailObserver());
orderService.addObserver(new SmsObserver());
orderService.addObserver(new PointsObserver());
orderService.addObserver(new PushObserver());  // 新增功能

实际应用场景

  1. 事件监听系统(GUI编程中的按钮点击事件)
  2. 消息队列(Kafka、RabbitMQ的发布订阅模式)
  3. Spring的事件机制(ApplicationEvent)
  4. 数据绑定(Vue、React的响应式数据)

优缺点

优点:

  • 降低耦合度,主题和观察者之间是抽象耦合
  • 支持广播通信
  • 符合开闭原则,增加新观察者无需修改主题

缺点:

  • 如果观察者很多,通知会花费较多时间
  • 如果观察者和主题之间有循环依赖,可能导致系统崩溃
  • 观察者不知道主题如何变化,只知道变化发生了
设计模式——行为型模式(二) 黑马设计模式 阅读详情

相关推荐

R语言实战:GEO单细胞数据下载与自动化整理全流程(附代码)

本文详细介绍了使用R语言从GEO数据库下载scRNA-seq数据并实现自动化整理的完整流程。通过GEOquery和Seurat等工具包,读者可以高效获取单细胞RNA测序数据,完成从原始数据下载到预处理的全过程,最终生成可直接用于分析的Seurat对象。文章包含完整代码示例,特别适合生物信息学研究者处理单细胞数据。

weixin_29061821的博客 429

设计模式之行为型模式二

行为型模式: 职责链模式     使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.          优点:     当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它.     接收者和发送者都没有对方的明确信息,且链中的对象自

何静媛 1805

Cadence Virtuoso里搞定斩波运放AC仿真:PSS+PAC保姆级设置避坑指南

然而,当工程师们尝试在Cadence Virtuoso环境中对这种特殊结构进行AC特性分析时,往往会遇到传统AC仿真方法失效的困境——这正是PSS(Periodic Steady-State)与PAC(Periodic AC)仿真组合大显身手的场景。实际项目中我们常采用"先快后精"的两步法:先用快速设置确认大体趋势,再针对关键频段进行精细仿真。例如某次设计迭代中,将harmonics从10增加到20后,发现在1MHz处的相位裕度估算误差达15°,这解释了之前样机测试时的振荡问题。

weixin_33508411的博客 453

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

行为型模式第二部分:解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。 解释器模式     给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。          使用时期     如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通

郑颖的优快云 1665

hcaptcha-challenger:基于本地AI模型自动破解验证码的工程实践

验证码作为区分人类与机器的经典安全机制,其核心原理是通过图像识别、行为分析等交互式挑战来阻挡自动化程序。传统绕过方法依赖第三方打码平台或脚本,存在成本高、稳定性差的问题。随着多模态大语言模型和计算机视觉技术的发展,本地化AI求解成为新的技术方向,它通过集成YOLO、ResNet等模型,在本地完成图像语义理解,实现了高隐私、低成本、可进化的验证码自动化解决方案。这种范式尤其适用于需要大规模稳定处理网页交互的场景,如电商数据采集和社交媒体管理。hcaptcha-challenger项目正是这一理念的工程实践,它

weixin_42587866的博客 1028

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

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

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

Eriksen的博客 607

世界职业院校技能大赛财经赛道项目参考逐字稿五

世界职业院校技能大赛财经赛道项目参考逐字稿五

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 141

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

行为型模式包括:观察者模式、模板方法模式、命令模式、状态模式、职责链模式、解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式。 这篇,介绍的是:解释器模式、中介者模式、访问者模式、策略模式、备忘录模式、迭代器模式 解释器模式: 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

相由心生-心随相改~ 1751

从微服务到 Agent 服务:架构思维的迁移

微服务的概念最早在2014年由Martin Fowler提出,核心是“将单体应用拆分为一组小的服务,每个服务运行在独立的进程中,服务之间采用轻量级的通信机制互相协作,每个服务围绕具体业务构建,并且可以独立部署到生产环境”。单一职责:每个微服务只负责一个业务领域的功能,比如订单服务只处理订单相关的逻辑,用户服务只处理用户相关的逻辑被动响应:微服务是“哑的”,只有收到外部请求的时候才会执行逻辑,本身没有主动决策的能力固定流程:微服务的逻辑是硬编码的,执行流程是提前定义好的,只能按照程序员写的代码处理请求。

AI智能探索者的博客 275

Arcgis中的模型构建器技术之按属性批量建库并对应输出

好久没更新了,之前我们已经介绍过四至点提取模型,前两天有同事问怎么样按属性批量建数据库并对应输出相关图斑。比如将一个县的永农数据按乡镇建立数据库并将对应乡镇的永农数据输出到相应的数据库里。今天就介绍一下相关的模型构建过程。

weixin_44671081的博客 518

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

解释器模式中介者模式访问者模式策略模式备忘录模式迭代器模式

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

医疗数据采集:Python爬虫爬取医学文献与药品信息(2026合规与伦理版)

医疗数据采集不同于爬取新闻或房价,它直接关系到人的生命健康和法律底线。技术层面:优先使用官方 API (PubMed E-utilities, BioThings),避免解析复杂HTML。法律层面:严守“不碰隐私、不破付费、不传谣言”三条红线。伦理层面:保持对生命的敬畏,确保数据的准确性和用途的正当性。在2026年,一个优秀的医疗数据工程师,不是那个能爬取最多数据的人,而是那个能在合规框架下,利用公开数据解决真实医疗问题的人。请务必珍视您的职业生涯和法律责任,切勿以身试法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 287

java设计模式二(行为型)

设计模式之行为型

简单,快乐,拥抱变化 224

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【设计模式】行为型模式(二):策略模式、命令模式

命令模式(Command)是一种行为设计模式,它将请求封装成一个对象,从而使你能够用不同的请求、队列或者请求日志来参数化其他对象。命令模式也支持可撤销的操作。

Data · Model · Agent · Repeat 1243

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

设计模式被分成了三大类型:创建型、结构型和行为型。本文介绍一下行为型模式中的解释器模式、中介者模式、访问者模式、策略模式、备忘录模式和迭代器模式。 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间

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

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

【1】引入              在这组的行为模式中包括解释器模式,中介者模式,访问者模式,策略模式,备忘录模式,迭代器模式。 【2】各模式简介 一:解释器模式         通常当有一个语言需要解释执行时,即该语言有一定的代表性和广泛性时,就要涉及到解释器模式。 二:中介者模式             即用一个中介对象来封装一系列的对象之间的交互关联关系,且中介者需要知

keep innocent 1455

设计模式-行为型模式讲解二(模板、策略、解释器)

一、行为型设计模式 上篇,我们呢讲解了-行为型设计模式的责任链、命令、迭代器模式。 文章地址:https://blog.youkuaiyun.com/qq_43692950/article/details/120404903 这篇文章我们来讲解下行为型设计模式的模板方法、策略、解释器模式。 二、模板模式 在模板模式(Template Pattern)中,有些又叫模板方法设计模式,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 它的优点有封装不变扩展可

小毕超博客 4589

GoF设计模式(二)-行为型模式简介

文章目录复用决策与扩展决策的行为由具体子类决定Template 模板行为由其他类的对象决定Strategy 策略(库)行为State 状态(机)行为由具体子类决定与其他类的对象决定Visitor 访问者行为用于遍历对象集合行为Iterator 迭代器行为Visitor 访问者行为用于解耦的行为降低多个对象和类之间的通信复杂性Mediator 中介行为请求者与实现者解耦Command 命令化(指令化)Chain of Responsibility 责任链Interpreter 解释器降低一对多的复杂度Obse

weixin_43868793的博客 705

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

本文接着介绍xingweixing

yanzi1225627的专栏 2155

PHP 行为型设计模式(二)

续上一篇:PHP行为型设计模式(一),介绍第二类行为型设计模式。 两个类之间: 观察者模式 (observer Pattern) 迭代器模式 (Iterator Pattern) 责任链模式 (Chain of Responsibility Pattern) 命令模式 (Command Pattern) PHP设计模式(十四)—观察者模式 (observer Pattern) 观察者模...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值