行为型模式

本文深入解析了设计模式的核心概念,包括监听器模式、生产者消费者模式等,阐述了它们的实现原理与应用场景,如事件源-事件-监听器的紧耦合特性,以及生产者与消费者间通过消息中间件实现的松散耦合,强调了这些模式在软件设计中的重要性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、清晰的划分类或对象的行为或职责,定义他们之间的相互协作,完成复杂的功能
2、监听器模式、模板模式、策略模式、责任链模式、访问者模式、状态模式、备忘录模式、中介者模式、迭代器模式、命令模式、解释器模式

一、监听器 / 观察者模式

// 事件源-事件-监听器
eventSource-event-listener(handler)
eventSource.addListener

// 被观察者-消息-观察者
observable-message-obserber(handler)
observalbe.subscribe

/**
 * 事件源和监听器是紧耦合的
 * 事件源提供注入监听器的方法,使用前必须注入特定的监听器
 * 事件源提供触发事件的方法,并在方法中调用监听器提供的回调函数
 */
public class Event {}
public class EventSource {
	private EventListener listener;
    public void setEventListener(EventListener listener) {
        this.listener = listener;
    }
    public void happenEvent(Event e) {
        listener.doEvent(e);
    }
}
public class EventListener {
    public void doEvent(Event e) {}
}

二、生产者消费者 / 发布订阅模式
生产者producer和消费者consumer是松散耦合的,两者之间无法感知对方的存在,需通过消息中间件关联
生产者:调用send方法发送带主题的消息到消息服务器
消息message:带有主题属性的信息
消息服务器broker:接收指定主题的消息入队,通知订阅该主题的消费者
主题topic:发布订阅方式,所有订阅该主题的消费者都会拿到消息来消费
队列queue:点对点方式,所有消费者都可从队列中取消息,但只能有一个消费者拿到消息并消费
消费者consumer:接收消息,并回调处理函数;有两种接受消息的方式:push推、pull拉
消息监听器/处理器MessageListener/Handler:确定topic,提供消息处理方法onMessage(List messages)

broker push
1、consumer启动后连接broker,告知broker它要订阅的topic
2、broker维护一个map,k-topic,v-订阅该topic的consumer列表
3、当主题队列中有消息时,borker从map中取出对应主题的消费者列表
异步发送消息给各个consumer,消费者拿到消息后执行消息处理函数,consumer需要有一个线程监听broker发送的消息
以rpc的方式异步调用各个consumer的消息处理函数

consumer pull
消费者需要编写pull函数,以轮询或者定时的方式从broker拉取消息,然后调用消息处理函数处理
可以按照自己的节奏控制消费,需要额外的cpu消耗
可能导致消费延迟,数据不一致,消息服务器消息积压

特点
1、解耦:无实际调用关系
反例:a、b系统交互,b需要调用a的api拿到数据再做处理
2、异步:减少同步阻塞,提高响应时间
反例:修改配置接口,需先入库然后同步缓存,导致入库后同步阻塞等待缓存完成,若缓存失败入库也要重试
3、存储:消息持久化,可以重试、找回、恢复、排查
4、扩展:增删业务方便,上游新增业务后,下游新增一个消息订阅即可,仅做扩展
5、过载保护:若上游产生了大量变更操作,下游按自己的节奏消费,起到缓冲

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值