设计模式---职责链(Chain Of Responsibility)

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程) 本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者和嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。 阅读详情

一.需求的提出:

研发流程中,一个缺陷的生命周期如下:

提交缺陷(测试人员)->CCB审核(CCB)->开发团队审核(SM)->解决缺陷(开发人员)

现尝试编写一段Demo代码来示意,这个处理过程。

二.无设计的实现版本:

`

class Handler:
    def __init__(self, role):
        self._role = role

    def deal_with_bug(self, bug):
        # 处理逻辑简单示意一下
        if self._role == 'Tester':
            print('Tester:提交缺陷:%s' % bug)
        elif self._role == 'CCB':
            print('CCB:缺陷审核通过:%s' % bug)
        elif self._role == 'SM':
            print('SM:开发团队指派解决:%s' % bug)
        else:
            print('DEV:解决缺陷:%s' % bug)

if __name__ == '__main__':
    Bug = "传输建链失败"

    Tester = Handler('Tester')
    CCB = Handler('CCB')
    SM = Handler('SM')
    DEV = Handler('DEV')

    Tester.deal_with_bug(Bug)
    CCB.deal_with_bug(Bug)
    SM.deal_with_bug(Bug)
    DEV.deal_with_bug(Bug)

`

存在的问题:

  1. 违背开放封闭原则:
    Handler类如果在需求发生变更需要引入更多的处理角色的时候,难免需要对deal_with_bug函数进行修改。实例代码逻辑简单可能感觉不出有太大危害,但是如果是代码逻辑复杂的工程项目则有引入缺陷的风险。

  2. 违背单一职责原则:
    Handler类职责过多,几种角色的处理逻辑全部塞到deal_with_bug一个函数中。

三.驱动表的方式进行重构:

在面向过程编程的泛型中,驱动表是常用的抽象方式。针对deal_with_bug函数中由于if…else结构。采用驱动表的方式进行抽象。并将不同角色的处理动作的实现也从deal_with_bug函数中抽离,从而解决了单一职责问题和一定的开放封闭原则问题。

但驱动表的dict结构,在新需求引入的时候还是会存在一定的修改。

`

def tester_deal(bug):
    print('Tester:提交缺陷:%s' % bug)


def ccb_deal(bug):
    print('CCB:缺陷审核通过:%s' % bug)


def sm_deal(bug):
    print('SM:开发团队指派解决:%s' % bug)


def dev_deal(bug):
    print('DEV:解决缺陷:%s' % bug)


deal = \
    {
        'Tester': tester_deal,
        'CCB': ccb_deal,
        'SM': sm_deal,
        'DEV': dev_deal
    }


class Handler:
    def __init__(self, role):
        self._role = role

    def deal_with_bug(self, bug):
        deal[self._role](bug)


if __name__ == '__main__':
    Bug = "传输建链失败"

    Tester = Handler('Tester')
    CCB = Handler('CCB')
    SM = Handler('SM')
    DEV = Handler('DEV')

    Tester.deal_with_bug(Bug)
    CCB.deal_with_bug(Bug)
    SM.deal_with_bug(Bug)
    DEV.deal_with_bug(Bug)

`

四职责链方式重构:

职责链 是在多个对象都有机会处理同一个请求的情况下,为了避免对象之间的耦合将处理对象串成一条链,将请求在链中依次传递并处理。

在这里插入图片描述

`

from abc import ABCMeta, abstractmethod


class Handler(metaclass=ABCMeta):
    def __init__(self):
        self._next = None

    def set_next_handler(self, next_handler):
        self._next = next_handler

    @abstractmethod
    def deal_with(self, bug):
        pass


class Tester(Handler):
    def deal_with(self, bug):
        print('Tester:提交缺陷:%s' % bug)
        self._next.deal_with(bug)


class CCB(Handler):
    def deal_with(self, bug):
        print('CCB:缺陷审核通过:%s' % bug)
        self._next.deal_with(bug)


class SM(Handler):
    def deal_with(self, bug):
        print('SM:开发团队指派解决:%s' % bug)
        self._next.deal_with(bug)


class DEV(Handler):
    def deal_with(self, bug):
        print('DEV:解决缺陷:%s' % bug)


if __name__ == '__main__':
    Bug = "传输建链失败"

    tester = Tester()
    ccb = CCB()
    sm = SM()
    dev = DEV()
	
	#定义职责链
    sm.set_next_handler(dev)
    ccb.set_next_handler(sm)
    tester.set_next_handler(ccb)
	
	#从链首触发职责链上的所有节点进行处理
    tester.deal_with(Bug)

`

可以看到通过职责链方式重构以后,面向对象的味道更浓,新需求引入后,也不存在对原有对象的任何修改,开放封闭原则也遵守得更好。

osgearth添加经纬度网格,并显示鼠标所指经纬高度信息 一、代码 osgearth官方例子 #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers> #include <osgEarth/MapNode> #include <osgEarthUtil/EarthManipulator> # 阅读详情

相关推荐

MS2107 CVBS转USB2.0 音视频采集芯片,支持1080P@30HZ输出

MS2107 是一款视频和音频采集芯片,支持CVBS转USB2.0 ;可以将 CVBS、S-Video 和音频信号通过 USB接口传送到 PC、智能手机和平板电脑上预览或采集。

TEL18967112838的博客 2075

职责链设计模式

在日常的生活中,有如下情况,你提出了借钱的请求,这个请求需要处理,200块以下你的同学就能帮你处理,200以上500一下你的好友能够帮你处理,500以上你的父母帮你处理,50000以上银行帮你处理。这有四个对象,他们都有一个共同的方法,就是借钱给你。 这时你可能会有4个if - else语句来解决你的需求,然而在日常的开发生活中,对象不见得一定就是这4位,比如领导现在也能问你借钱了,那就要添加一个...

h1311454244的博客 298

学习记录-Simpack生成车轮不圆的几种示例

单阶、多阶和实测车轮多边形的添加教程

weixin_51965897的博客 3705

设计模式之——责任链设计模式

责任链设计模式

骑猪追大象 944

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 325

Unity3D安装:离线安装 Unity

Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中,可下载用于安装 Unity 的所有文件,然后生成脚本以便在未接入互联网的其他计算机上重复相同的安装。运行下载助手,并在一台计算机上正常安装 Unity。此计算机必须有足够的可用磁盘空间来下载所有文件。单击下拉选单并选择 __Custom__,然后选择要将文件下载到的位置。打开 PC 的文件管理器,导航到之前指定的自定义位置文件夹,然后在该文件夹内查找。整理翻译,转载请注明出处!

ygtu2018的博客 3252

【设计模式】行为模式之Chain of Responsibility职责链

Chain of Responsibility职责链是一种对象行为型设计模式,目的是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;或者你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;或者可处理一个请求的对象集合应被动态指定

Making Life Better. Making Others Better. 1173

基础知识学习 -- qnx 系统

qnx os车载系统

求变,从思想开始 3872

设计模式——2_0 职责链(Chain of Responsibility)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理她为止

乡亲们啊的博客 1560

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1927

手把手教你绕过Incapsula reese84防护:从JS反混淆到动态Token生成全流程

本文深入解析了以Incapsula reese84为代表的现代Web客户端挑战防护机制,详细介绍了从JS反混淆、算法逆向到动态Token生成的全流程实战方法。文章系统阐述了如何通过模拟浏览器指纹、移植关键算法或嵌入JS引擎来构建自动化应对策略,并提供了稳健的令牌管理与系统架构设计思路,帮助开发者在合规前提下提升自动化工具的适应性。

jenkins8butler的博客 516

设计模式中职责链 chain of responsibility案例举例

如果请求无法在当前处理程序中处理,它将被传递给职责链中的下一个处理程序,直到找到一个可以处理该请求的处理程序为止。这个例子中,CEOHandler担当责任链中的最后一个处理器,在它之前的处理器都没有能够处理请求时,请求会传递到CEOHandler中。而VPHandler只能够处理特定类型的请求,如果收到其他类型的请求,就会将请求传递给下一个处理器。假设我们有一个餐厅系统,餐厅可以接收来自不同用户的点餐,但是每个用户都有不同的需求和特殊要求,因此我们需要一种技术来处理这些请求并将它们传递给正确的对象。

人工智能全栈工程师 | 智能算法研发与实战落地​专注于人工智能算法研究、代码实现与工程落地,提供从模型设计到部署应用的全流程解决方案。 1056

大疆 2021 嵌入式笔试题

在深圳做嵌入式,大疆公司绝对是 Top 级别的,大疆的技术栈也很深。

qq_38769551的博客 2495

设计模式之(十五)职责链Chain of Responsibility

Chain of Responsibility定义 Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request. 也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。 如...

weixin_34413357的博客 1120

Camera2Demo

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

设计模式——职责链(chain of responsibility)

常常在一些组件内部会有特定数据结构,如果客户代码直接使用这些特定数据结构,会极大破坏组件复用;因此,可以将组件中主句结构封装在内部,为外部提供统一的接口,来实现与特定数据结构无关的访问。 composite,iterator,chain of responsibility属于数据结构模式。 motivation:一个请求可能会被多个对象处理,但是每个请求只能有一个接收者;如果显示指定,一定会给...

chkay399的博客 265

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

設計模式之Chain of Responsibility(職責鏈)

Chain of Responsibility定義Chain of Responsibility(CoR) 是用一系列類別(classes)試圖處理一個請求request,這些類別之間是一個鬆散的耦合,唯一共同點是在他們之間傳遞request。 也就是說,來了一個請求,A類別先處理,如果沒有處理,就傳遞到B類別處理,如果沒有處理,就傳遞到C類別處理,就這樣象一個鏈條(chain)一樣傳遞下去。

297

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

16 C++设计模式之职责链(Chain of Responsibility)模式

职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。...

carson的博客 712

Chain of Responsibility(职责链设计模式)

一、概念 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。 二、模式结构图

Sharing_Li的专栏 852

Chain of Responsibility 设计模式--职责链方法

模板方法示意图 模板方法模式的QT代码实现 #ifndef HANDLE_H #define HANDLE_H #include #include class Handle { protected: Handle *m_successor; public: Handle(); virtual ~Handle()=0; void setHandle(Handle *); virtual void handleRequest(int request) = 0; }; class SupervisorHan

m1223853767的博客 197

设计模式——Chain of Responsibility(职责链)模式

文章目录一图胜千言场景和代码场景描述代码Handler-抽象处理者ConcreteHandler-具体处理者Client-提出请求 一图胜千言 场景和代码 场景描述 比如小明去商场买鞋子,他的脚是40码的,那么在试穿鞋子的时候可以按照鞋 码比如37、38、39、40 顺序试鞋子,直到遇到合脚的 代码 Handler-抽象处理者 /** * 抽象处理者 */ public interface Handler { /**处理请求*/ void deal(int number); /

༺ bestcxx的专栏 ༻ 444

【GeekBand】C++设计模式笔记22_Chain of Responsibility_职责链

【GeekBand】C++设计模式笔记22_Chain of Responsibility_职责链

qq_38154295的博客 612

设计模式13 - 职责链Chain-Of-Responsibility

Decoupling is one of the prominent mantras in software engineering. Chain of responsibility helps to decouple sender of a request and receiver of the request with some trade-offs. Chain of responsibil

songuo' s home 627

设计模式(十三) 职责链(chain of responsibility)

软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍装饰模式的实现。 职责链模...

anpiwen0001的博客 150

Java设计模式——职责链( Chain of Responsibility)模式

职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 模式动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显式指定,将必不可少地带来请求发送者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦。 模式定义使多个对象都有机会处理请求,从而避免请求的发送者和.接收者之间

qq_45462042的博客 301

设计模式之 Chain of Responsibility(职责链)通俗理解

1 Chain of Responsibility 定义 Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递 request. 也就是说,来了一个请求,A 类先处理,如果没有处理,就传递到 B 类处理,如果没有处理,就传递到 C 类处理,就这样象一个链条(chain)一样传递下去。 2 如何使用? 1 异常处理try catch就是CoR模式 2举例:小新请假,找领导批示;请

码灵的博客 503

设计模式之美:Chain of Responsibility(职责链)

索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现后继者链。 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它位置。 Avoid coupling the sender of a request to its receiv...

aijianxie8808的博客 171
上一篇: ISTQB知识体系中的测试过程及其要点
下一篇: 设计模式---适配器模式(Adapter)
牛屁哄哄叫兽
博客等级 码龄18年 56粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值