如何理解Java设计模式责任链模式

技术如何理解Java设计模式责任链模式本篇文章给大家分享的是有关如何理解Java设计模式责任链模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、责任链模

本文是关于如何理解Java设计模式的责任链模式。边肖觉得很实用,所以想分享给大家学习。希望大家看完这篇文章能有所收获。话不多说,让我们和边肖一起看看。

一、责任链模式

定义

创建多个对象,使这些对象形成一条链,并沿着这条链传递请求,直到链上的某一个对象决定处理此请求。

00-1010 1)接收请求的对象被连接成一条链,并且在对象之间存在层次关系。

2)这些对象可以处理请求,也可以传递请求,直到某个对象处理了请求。

00-1010责任链模式涉及的角色如下:

- 抽象处理者角色:定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。

- 具体处理者角色:实现或者继承抽象这角色,具体逻辑根据实际的架构来定,后面会提到。

00-1010首先看一下抽象处理器角色代码:

公共抽象类处理程序[

私有处理程序nextHandler

私有int级别;

公共处理程序(int级别){ 0

this.level=level

}

//处理请求传递,注意final,子类不能重写。

公共最终无效句柄消息(需求需求){ if(level==Demand . demandlevel())}

this.report(需求);

} else { if (this.nextHandler!=null){ 0

system . out . println(‘事情太严重,不能上报给上级’);

this.nextHandler.handleMessage(需求);

} else {

system . out . println(‘我是老板,不是老板’);

}

}

}

public void setnext Handler(Handler Handler){ 0

this.nextHandler=handler

}

//抽象方法,子类实现。

公开摘要作废报告(需求需求);

}

在抽象处理程序的角色中,定义了处理请求的抽象方法和下一级传递的对象方法,重点是通过handleMessage处理请求传递的方法。下面将解释为什么写这个,并继续往下看。

下面是特定的处理器角色,它继承了抽象处理器角色。在我们的场景中,有两个特定的处理器,即技术经理和boss。

//技术经理。

公共类技术管理器扩展了处理程序

public TECHNOLOGy MANAGER(){ 0

super(1);

}

/>

    @Override

    public void report(Demand demand) {

        System.out.println("需求:" + demand.detail());

        System.out.println(getClass().getSimpleName() + ":小猿我挺你,这个需求不干");

    }

}

// boss

public class Boss extends Handler {

    public Boss() {

        super(2);

    }

    @Override

    public void report(Demand demand) {

        System.out.println("需求:" + demand.detail());

        System.out.println(getClass().getSimpleName() + ":你们打一架吧,打赢的做决定");

    }

}

可以看到具体处理者的代码很简洁,重写了report方法,实现各自的业务逻辑,这都归功于父类中handleMessage这个方法。

两个角色都定义好了,来看客户端如何实现:

public class Client {
    public static void main(String[] args) {
        Demand demandA = new DemandA(); // 请求等级低
        Demand demandB = new DemandB(); // 请求等级高
        Boss boss = new Boss();
        TechnicalManager technicalManager = new TechnicalManager();
        technicalManager.setNextHandler(boss); // 设置下一级
        technicalManager.handleMessage(demandA);
        System.out.println("============================");
        technicalManager.handleMessage(demandB);
    }
}

可以看到在客户端中的重点是设置下一级的处理者,这样多个处理者对象就会形成一条链。运行客户端,结果如下:

需求:加一张露一点点的图
TechnicalManager:小猿我挺你,这个需求不干

============================
需求:加一张露一点点的图
TechnicalManager:事情太严重,需报告上一级
Boss:你们打一架吧,打赢的做决定

从结果可以看到,级别低的请求技术经理自己处理,级别高的传递给了下一级的Boss,这样就形成一条链,而这也是责任链的核心所在。注意,在请求的传递过程中,请求是不会发生变化的。需求不会从“加一张露一点点的图”变成了“加一张露点的图”,这等着boss请到办公室喝茶吧。

三、扩展

责任链+模板方法

回头看看上面的代码,抽象类中定义了几个方法,一个是final修饰的handleMessage,一个是抽象方法report,还有一个是setNextHandler。这刚好是模板方法模式中的三个基本方法,分别是具体方法(抽象类声明并实现,子类不实现)、抽象方法(抽象类声明,子类必须实现)、钩子方法(抽象类声明并实现,子类可扩展)。handleMessage方法加了final修饰,子类不可重写,而handleMessage正是把传递请求工作交给父类Handler,子类不需要处理传递的工作。而report则是抽象方法,子类必须重写该方法,子类处理请求的业务逻辑。setNextHandler是钩子方法,在这里我们并没有实现。

这样结合模板方法模式的好处在哪?首先加了handleMessage方法,把请求的传递判断从子类中剥离出来,让子类在report方法中专心处理请求的业务逻辑,做到了单一职责原则。再者是子类的实现变得简单了,不需要进行传递的判断,非常有利于快速扩展。

责任链模式VS观察者模式

观察者模式我在之前有写过,不了解的可以先看看。责任链模式和观察者模式存在一个共同点,就是传递责任链模式是一级一级的传递,形成一条链,链节点(处理者)之间是存在传递关系的。而观察者模式的被观察者向观察者们的传递,并不是具体观察者之间的传递,观察者之间是不存在关联的。拿小猿的经历来说,在责任链模式中是请求从技术经理到boss,有层级关系,而对于观察者模式是从被观察者小猿发出,作为观察者的技术经理和boss都会收到小猿的通知,是扩散式的,技术经理和boss并没有层级关系。这是责任链模式和观察者模式的区别,也是责任链模式的核心。

四、责任链模式的优缺点

优点

1)降低耦合度:客户端不需要知道请求由哪个处理者处理,而处理者也不需要知道处理者之间的传递关系,由系统灵活的组织和分配。

2)良好的扩展性:增加处理者的实现很简单,只需重写处理请求业务逻辑的方法。

缺点

1)请求会从链头发出,直到有处理者响应,在责任链比较长的时候会影响系统性能。

2)请求递归,调试排错比较麻烦。

责任链模式在实际项目中可以用到的地方还是比较多的,比如会员等级系统,会员等级之间构成一条链,用户发起一个请求,系统只要把请求分发到责任链模式的入口,直到传递到与用户会员匹配的等级,这样各个会员等级的业务逻辑就会变成很清晰。这篇折腾了很久,主要是想把责任链的核心阐述清楚,让大家能够容易理解,也让我重新思考了责任链模式的核心。下一篇是“还没想好”,您的点赞和关注是我的动力哦,再会!

以上就是如何理解Java设计模式责任链模式,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/44628.html

(0)

相关推荐

  • 敦厚的近义词和反义词,“质朴”的近义词和反义词有哪些

    技术敦厚的近义词和反义词,“质朴”的近义词和反义词有哪些“质朴”的近义词: 俭约[ jiǎn yuē ] 俭省节约——奢则妄取苟取,志气卑辱敦厚的近义词和反义词;一从俭约,则于人无求,于己无愧,是可以养气也。俭朴[ ji

    生活 2021年10月22日
  • 中庸,大家对中庸知道有什么见解

    技术中庸,大家对中庸知道有什么见解儒家经典《中庸》说:“‘’尊德性而道问学,致广大而尽精微,极高明而道中庸,”极高明而道中庸的境界在我们平凡的生活中就可以达到,那就是永保内心的安静中庸、忌急功近利、永不骄不躁、不大喜亦不

    生活 2021年10月23日
  • properties在哪里设置(properties怎么配置)

    技术Properties如何使用本篇内容介绍了“Properties如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成

    攻略 2021年12月17日
  • 您考虑的任何香港云服务器都应该提供的5个功能

    技术您考虑的任何香港云服务器都应该提供的5个功能无论您的独特需求是什么,每个网站所有者都应该在租用云服务器的时候关注五件事。1.可靠的性能 您想自信地知道,只要有人尝试导航到您的网站,他们就会看到您设计的网站。否则,你付

    礼包 2021年11月9日
  • 实践的名人例子,有关实践的名人事例50字

    技术实践的名人例子,有关实践的名人事例50字1、李时珍在年轻的时候就听人说,有一种神奇的植物叫曼陀罗,李时珍费 了一些周折,终于找到了这种植物,他为了探明究竟,亲自服下了曼陀罗,发现它有麻醉和使人兴奋的作用,少量可以治病

    生活 2021年10月21日
  • 抖音播放量怎么刷,怎么能让抖音粉丝暴涨?

    技术抖音播放量怎么刷,怎么能让抖音粉丝暴涨?最近关于到抖音的问题,小编被大家问的最多的就是抖音刷播放量有效果吗?因为目前大家都有所耳闻,就是关于抖音上视频要是想火起来,被上到推荐上的话,那么就需要进行刷播放量,所以抖音刷

    测评 2021年10月20日