一周两个设计模式—设计模式之责任链模式(第五周)

举报
浮生闲半日 发表于 2021/11/23 18:49:33 2021/11/23
【摘要】 业务场景:“小犬,小犬,咖啡系统的预定流程需要优化一下。”,一大早,哮天犬就被手机从睡梦中叫醒接到了李天王的要求,“优化?这不是一直都运行的很好吗?为什么要优化?凭什么优化?我已经把系统开发完了。”,为什么小犬子今天这么强硬呢,原来是上次说解决分店的问题后就给小犬个编制,可是结果是问题解决完了,编制却没有信儿了,仔细一打听才知道是被牛郎给顶替了,所以小犬这次生气并且是很生气的那种,因为这个编...

业务场景:

“小犬,小犬,咖啡系统的预定流程需要优化一下。”,一大早,哮天犬就被手机从睡梦中叫醒接到了李天王的要求,“优化?这不是一直都
运行的很好吗?为什么要优化?凭什么优化?我已经把系统开发完了。”,为什么小犬子今天这么强硬呢,原来是上次说解决分店的问题后
就给小犬个编制,可是结果是问题解决完了,编制却没有信儿了,仔细一打听才知道是被牛郎给顶替了,所以小犬这次生气并且是很生气
的那种,因为这个编制的事情玉兔都差点和它分手了,能不生气吗?

“小犬啊,我知道上次的事情上面的人办的不地道。”,天王是多么狗的一个人啊,肯定知道今天小犬生气的原因。“可是,你也得知道,牛郎
和七仙女两个分居这么久了,并且人家的故事这么感人,都获得感动天庭的十大人物了,玉帝都不好意思了,所以老大下的命令占了一个名额,
不好运的轮到你了,这次只要解决了问题,下次评优肯定有你,我把三小子的名额给你。”,天王都说到这了还能有什么办法呢?老流程,
问原因和需求吧。

原来是咖啡预定系统的问题,现在是天庭咖啡厅有N个师傅,但是技术参差不齐,但是系统分订单的时候出问题,有些比较难的订单发给
新手师傅的手里了制作简单却分给大师手里了,好嘛,这样就出问题了,口感好的便宜,贵的口感很差,最近投诉都快顶不住了。

开始分析:

其实问题并不是很复杂,就是下订单到底是谁来接的问题,为每一笔订单设置一个权值,然后为每个师傅分配权值适用范围,例如新手
净坛使者只能接受权值小于5的订单,白龙马因为有了一定的经验可以接订单权值小于10的,而特邀技师弼马温可以接收小于60的,如果
难度大于60直接拒绝或者直接让玉帝来处理,这样是不是很清晰。

告诉我你们的第一反应是不是if else语句,这样肯定可以实现这个功能,但是有没有考虑到如果在细分呢,代码是不是很乱并且耦合度
太高、并且不易维护并且随着时间的推移,维护都是一个问题。怎么办呢,古话讲兵马未动粮草先行,作为技术大牛肯定得先思考怎么处理
,经过分析决定使用责任链模式了。

输入条件-》A处理如果不够权限-》B处理-》C处理-》D处理,其中有任何一个人处理就直接返回处理结果,就是结单。

有了明确的目的,下面就是实现了。

可以把制作咖啡分为四个级别 0—10、10—20、20—30、30—40。

然后开始实现,通过介绍肯定能想到,低级有高级别的引用,A里面肯定有B的引用,B里有C的引用。不多哔哔了,直接搞代码。

设计模式最主要的就是抽象:

抽象:

abstract class CoffeeOrder {

     var nextReceiver:CoffeeOrder ?= null  //下一级的引用,这里处理一下

     abstract fun receive(num:Int)  //具体实现的逻辑
}

具体实现类:

//只有实现,如果超过则下一级处理,第一级别
 class PigOrder:CoffeeOrder() {
    override fun receive(num: Int) {
        if(num<10){
            Log.v("=========","老猪处理了")
        }else{
            if(super.nextReceiver != null){
                super.nextReceiver?.receive(num)
            }else{
            Log.v("=========","老猪处理不了了")
            }
    }
  }
}

//第二级别
 class HorseOrder:CoffeeOrder() {
override fun receive(num: Int) {
    if(num<20){
        Log.v("=========","白龙马处理了")
    }else{
        if(super.nextReceiver != null){
            super.nextReceiver?.receive(num)
        }else{
            Log.v("=========","白龙马处理不了了")
        }
    }
}
}

依次类推,创建N个级别具体处理事件。

现在都创建出来了,如何引用呢?别着急,往下看。

sendOrderF = PigOrder()
sendOrderS = HorseOrder()
sendOrderT = MonkeyOrder()
sendOrderFO = BigOrder()
sendOrderT.nextReceiver = sendOrderFO
sendOrderS.nextReceiver = sendOrderT
sendOrderF.nextReceiver = sendOrderS

其实就是低一级引用高一级的实例,并且是顺序依赖,其实这个可以和创建者共同使用的,这样就完全抽离了。

哈哈,这一次的责任链就完事了,不对得总结一下:

优点

动态组合,使请求者和接受者解耦。

请求者和接受者松散耦合:请求者不需要知道接受者,也不需要知道如何处理。每个职责对象只负责自己的职责范围,
其他的交给后继者。

各个组件间完全解耦。

动态组合职责:职责链模式会把功能分散到单独的职责对象中,然后在使用时动态的组合形成链,从而可以灵活的分配职责对象,
也可以灵活的添加改变对象职责。

缺点

产生很多细粒度的对象:因为功能处理都分散到了单独的职责对象中,每个对象功能单一,要把整个流程处理完,需要
很多的职责对象,会产生大量的细粒度职责对象。

不一定能处理:每个职责对象都只负责自己的部分,这样就可以出现某个请求,即使把整个链走完,都没有职责对象处理它。
这就需要提供默认处理,并且注意构造链的有效性。

责任链模式在程序开发中的使用场景还是挺多的,主要适用于多个条件的筛选,例如部分需求在不同范围的想条件下需
要使用不同的处理方式但是总体的返回是没有变化的情况。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。