美文网首页
设计套路-责任链套路

设计套路-责任链套路

作者: 深爱蒲公英的纯美 | 来源:发表于2018-07-26 15:05 被阅读0次

定义

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

使用场景

  • 多个对象可以处理同一个请求,但是具体哪个对象处理则在运行时动态决定。
  • 在请求处理者不明确的情况下向多个对象中的一个提交请求。
  • 需要动态指定一组对象处理请求。

优点

  • 可以对请求者和处理者关系解耦,提高代码灵活性。

缺点

  • 对处理链中请求的遍历,如果处理者太多那么遍历必定会影响性能,特别是在递归调用中。

关键类

  • 处理请求的抽象类和具体类
  • 请求的抽象类和具体类。

在Android 源码的应用

  • 事件分发机制
  • 有序广播机制

生活实例

最近农村在测量土地,测量后重新登记,但是村里的王二麻子家测量的土地和登记的土地不一致,那么这个时候怎么办呢?村民嘛肯定是先向村长汇报,然后村长向乡长汇报,乡长向县长汇报。每一个领导的处理权限都不一样,级别越高,权利越大。这个地球人都知道,哈哈。当然村民也可以直接找乡长,或者县长,不过正常流程还是先找村长,因为县衙的大门不一定能进去。这个就是生活中的责任链的场景。现在我们涉及代码来实现。

处理的顶层抽象类:

   public abstract class Officer{
    public Officer lastOfficer;
    //权限等级
    public abstract int landNum();
    //对请求的统一处理
    public  void requestHandle(Request request){
        if (landNum() >= request.landNum()){
            handle(request);
        }else {
            if (lastOfficer!=null){
                lastOfficer.requestHandle(request);
            }
        }
    }
    //每一个请求的具体处理方法
    public abstract void handle(Request request);
}
  • lstOfficer字段代表上一级官员的引用,因为在责任链中处理的时候村长处理不了,那么需要通过这个引用去调用乡长去处理。
  • landNum() 用来设置自己的权限到底多大。
  • requestHandler(Request request) 这个方法是所有处理实现类共有的处理逻辑,当自己处理不了的时候就调用上一级官员处理。因为是共有的逻辑,所以封装在了顶层抽象类,简化代码。
  • handle(Request request) 每个处理实现类用来对请求进行具体个性化的处理。

处理的顶层请求类

public abstract  class Request {
    //需要处理的请求等级
    public abstract int landNum();
    //请求之后的结果通知
    public abstract void noticeResult(String result);
}
  • landNum() 在此案例中是王二麻子少登记的土地亩数,与官员权利处理等级一致。
  • noticeResult(String result) 当请求被处理后通知王二麻子,可有可无。

处理请求的具体实现类

public class villageOfficer extends Officer{
    public villageOfficer(){
        this.lastOfficer = new TownshipOfficer(); //指定下一个汇报对象是乡长
    }
    @Override
    public int landNum() {  //可以处理一亩地
        return 1;
    }

    @Override
    public void handle(Request request) {
        request.noticeResult("村长处理了");
    }
}
  • 这个是村长,可以处理王二麻子一亩地的请求,不用向上汇报。
  • 在它的构造方法中直接指定了它的向上汇报对象是镇长,当然也可以在请求的时候在灵活的指定。
public class TownshipOfficer extends Officer {
    public TownshipOfficer() {
        this.lastOfficer = new CountryOfficer(this);
    }

    @Override
    public int landNum() {  //可以处理3亩地
        return 3;
    }

    @Override
    public void handle(Request request) {
        request.noticeResult("乡长处理了");
    }
}
  • 这个是乡长的实现类,在这里乡长可以处理王二麻子3亩土地的请求。
  • 当然也直接在构造方法中指定了汇报对象是县长,也可以灵活指定。
public class CountryOfficer extends Officer{
    public CountryOfficer(TownshipOfficer townshipOfficer) {
    }

    @Override
    public int landNum() {  //可以处理10亩地
        return 10;
    }

    @Override
    public void handle(Request request) {
        request.noticeResult("县长解决了");
    }
}
  • 这个是县长的实现类,可以处理十亩地的请求。

请求的实现类

public class WangVillage extends Request{
    @Override
    public int landNum() {
        return 1;
    }

    @Override
    public void noticeResult(String result) {
        System.out.print(result);
    }
}
  • 王二麻子少登记一亩地。

请求开始

 WangVillage wangVillage = new WangVillage();   //创建请求
 villageOfficer villageOfficer = new villageOfficer();  //创建村长
 villageOfficer.requestHandle(wangVillage);       //向村长提交请求
  • 王二麻子写好了申请书,去了村长家递交了,等待消息,当然在这里你也可以直接向乡长县长提交。

总结

设计套路源于生活,套路的定义往往高度抽象,因为为了具有一般性,刚开始看开篇的定义可能一头雾水,看完王二麻子的故事,在回去看看开篇部分,可能会若有所悟。

相关文章

  • 设计套路-责任链套路

    定义 使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合,将这些对象连成一条链,并沿着这条链传递...

  • 设计套路-策略套路

    定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客...

  • 设计套路-状态套路

    定义 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 使用场景 一个状态的行为取决于它的...

  • 讲讲区块链里头的模式套路,骗子都在创新,你怎能不学习

    区块链很火,因为特有的金融属性,也产生了各种玩法套路,打着区块链的名义疯狂吸血。很多人说这些套路,都是区块链技术发...

  • 喜剧套路·角色设计篇

    喜剧套路·角色设计篇——同类相遇 和尚斗光头, 肥仔泡胖妞。 骗子骗骗子, 小偷偷小偷。 喜剧套路·角色设计篇——...

  • SEO套路教程(二)网站内容、内链、外链和友链

    SEO套路教程(二)网站内容、内链、外链、友情链接 大家好,我是高兴,很高兴今天来给大家讲解SEO套路教程(二)网...

  • 学习套路设计(三)

    学习套路设计(一)| 进度条——解决学习拖延症 和 学习套路设计(二)| 奖励与损失厌恶——解决学习拖延症 分析了...

  • vue3嵌套路由(后台管理系统)

    如何设计一个后台管理系统的路由呢?这里就需要使用到嵌套路由。 嵌套路由 带children的嵌套路由可以有页面,也...

  • SEO快排技术和应用技术编程大全 gogo闯

    授课内容简介 两个模块:「SEO套路」和「SEO应用编程」 「SEO套路」模块,分 “域名、内容&模板、关键词、链...

  • 算法6:设计中常用的武器-栈

    算法就是设计,而设计无处不在,故算法无处不在,但这是废话,关键还是,要把握设计的套路,如果能发明套路就更不得了。设...

网友评论

      本文标题:设计套路-责任链套路

      本文链接:https://www.haomeiwen.com/subject/jdbvmftx.html