职责链模式

举报
小鲍侃java 发表于 2021/09/10 00:24:52 2021/09/10
【摘要】 定义:为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 优点:1.客户端与具体的处理者解耦,客户端只认识一个Hanlder接口,降低了客户端(即请求发送者)与处理者的耦合度。         &...

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

优点:1.客户端与具体的处理者解耦,客户端只认识一个Hanlder接口,降低了客户端(即请求发送者)与处理者的耦合度。

           2.简化了对象。使得对象不需要知道链的结构。

缺点:1.提高了系统的复杂度。

           2.不能保证一定被处理。           

使用场景:多个类分别多次的调用。

类图:

通用代码:

Handler 接口


  
  1. static abstract class Handler {
  2. protected Handler mNextHandler;
  3. public void setnextHanlder(Handler successor) {
  4. this.mNextHandler = successor;
  5. }
  6. public abstract void handleRequest(String request);
  7. }

具体的处理类


  
  1. static class ConcreteHandlerA extends Handler {
  2. @Override
  3. public void handleRequest(String request) {
  4. if ("requestA".equals(request)) {
  5. //doSomething
  6. return;
  7. }
  8. //给下一个责任类
  9. if (this.mNextHandler != null) {
  10. this.mNextHandler.handleRequest(request);
  11. }
  12. }
  13. }

调用


  
  1. class Client {
  2. public static void main(String[] args) {
  3. Handler handlerA = new ConcreteHandlerA();
  4. Handler handlerB = new ConcreteHandlerB();
  5. //放入下一个责任类
  6. handlerA.setnextHanlder(handlerB);
  7. handlerA.handleRequest("requestB");
  8. }

栗子

抽象审批类():设计的核心类。处理请求和跳转请求。


  
  1. public abstract class ClassType{
  2. protected ClassType nextClassType;//下个责任对象
  3. public ClassType(String name) {
  4. super();
  5. this.name = name;
  6. }
  7. //设定下个责任对象
  8. public void setNextClassType(ClassType nextClassType) {
  9. this.nextClassType = nextClassType;
  10. }
  11. /**
  12. * 处理请求的核心的业务方法
  13. * @param request
  14. */
  15. public abstract void handleRequest(Long age);
  16. }

抽象实现类


  
  1. public class smallClass extends ClassType{
  2. @Override
  3. public void handleRequest(Long age) {
  4. if(age < 6){
  5. System.out.println("是小班我的人");
  6. }else{
  7. this.nextLeader.handleRequest(age);
  8. }
  9. }
  10. }

  
  1. public class middleClass extends ClassType{
  2. @Override
  3. public void handleRequest(Long age) {
  4. if(age > 6 && age < 8){
  5. System.out.println("是中班班我的人");
  6. }else{
  7. this.nextLeader.handleRequest(age);
  8. }
  9. }
  10. }

  
  1. public class bigClass extends ClassType{
  2. @Override
  3. public void handleRequest(Long age) {
  4. if(age > 8 && age < 10){
  5. System.out.println("是大班班我的人");
  6. }else{
  7. System.out.println("多大了 还来幼儿园");
  8. }
  9. }
  10. }

调用


  
  1. public class Client {
  2. public static void main(String[] args) {
  3. ClassType small = new smallClass();
  4. ClassType middle = new middleClass();
  5. ClassType big = new bigClass();
  6. //组织责任链对象关系
  7. small.setNextLeader(middle);
  8. middle.setNextLeader(big);
  9. //开始请假操作
  10. small.handleRequest(12);
  11. }

 

文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。

原文链接:baocl.blog.csdn.net/article/details/102665192

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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