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

概述


  • 职责链模式可以将请求的处理者组织成一条链,并让请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,实现请求发送者和请求处理者解耦。
  • 定义:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
  • 职责链模式是一种对象行为型模式。
  • 实现:
    • 定义一个抽象处理器。
    • 客户端可以定义链路结构,也可以在责任链中定义好链路结构。前者较灵活,后者更封装。
    • 多个具体处理角色实现抽象处理器,每个具体处理里面,聚合下一个处理器。
    • 如果第一个处理器不做处理则传递给第二个,依次传递,直到最后一个处理。
    • 组合出来的链应该是递归调用的。
  • 注意:责任链需要控制处理链的长度。
  • 学习难度:★★★☆☆
  • 使用频率:★★☆☆☆

优缺点


  • 优点
    • 请求者和执行者解耦,不需要关注谁处理的
  • 缺点
    • 性能问题:需要遍历联调
    • 类似递归的方式,调试难度大

类图


在这里插入图片描述

组成角色


  • 抽象处理角色(Handler)
  • 具体处理者角色(ConcreteHandler)

Code Example


抽象处理角色(Handler)
  • 定义处理方法
/**
 * 抽象处理器
 * 
 * @author yanbin
 * 
 */
public abstract class Handler {

   private Handler handler;

   /**
    * 实现的抽象处理方法
    * 
    * @param number
    * @return
    */
   public abstract String handleRequest(Long number);

   public Handler getHandler() {
      return handler;
   }

   public void setHandler(Handler handler) {
      this.handler = handler;
   }

}
具体处理者角色(ConcreteHandler)
  • 每个具体角色中聚合链条下一个处理者角色
/**
 * 具体处理角色
 * 
 * @author yanbin
 * 
 */
public class HandlerImplOne extends Handler {

   @Override
   public String handleRequest(Long number) {
      if (number > 10) {
         return "大于10跳出!";
      } else if (null != getHandler()) {
         return getHandler().handleRequest(number);
      }
      return "全部通过了!";
   }

}
/**
 * 具体处理类
 * 
 * @author yanbin
 * 
 */
public class HandlerImplTwo extends Handler {

   @Override
   public String handleRequest(Long number) {
      if (number > 8) {
         return "大于8退出了!";
      } else if (null != getHandler()) {
         return getHandler().handleRequest(number);
      }
      return "全部通过了!";
   }

}
/**
 * 具体处理类
 * 
 * @author yanbin
 * 
 */
public class HandlerImplThree extends Handler {

   @Override
   public String handleRequest(Long number) {
      if (number > 3) {
         return "大于3退出了!";
      } else if (null != getHandler()) {
         return getHandler().handleRequest(number);
      }
      return "全部通过了!";
   }

}
客户端
/**
 * 责任链模式 1、定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。<br/>
 * 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。<br/>
 * 2、运用场景:有多个类对请求处理,但不明确哪个类进行处理。可处理一个请求的对象应该被动态指定。<br/>
 * 3、具体类中的处理方法,组合出来的链应该是递归调用的。<br/>
 * 4、组成角色:抽象处理角色(Handler), 具体处理者角色(Concrete Handler)。<br>
 * 5、责任模式有解偶的情况。<br>
 * 6、客户端可以定义链路结构,也可以在责任链中定义好链路结构。前者较灵活,后者更封装
 * 
 * 
 * @author yanbin
 * 
 */
public class Responsibility {

   public static void main(String[] args) {
      // 从控制台输入数字
      System.out.println("请输入你要处理的数字:");
      Scanner input = new Scanner(System.in);
      Long testObject = input.nextLong();
      Handler handler1 = new HandlerImplOne();
      Handler handler2 = new HandlerImplTwo();
      Handler handler3 = new HandlerImplThree();
      handler1.setHandler(handler2);
      handler2.setHandler(handler3);
      String info = handler1.handleRequest(testObject);
      System.out.println(info);
   }

}

猜你喜欢

转载自blog.csdn.net/yanbin0830/article/details/89319285
今日推荐