• 设计模式16 责任链模式


    责任链模式(ChainOfResponsibility)定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

    责任链模式的优点有:

    1、低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。

    2、增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。

    3、增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。

    4、责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。

    5、责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

    任务链:

     1 public abstract class Handler {
     2     private Handler next;
     3 
     4     public Handler getNext() {
     5         return next;
     6     }
     7 
     8     public void setNext(Handler next) {
     9         this.next = next;
    10     }
    11 
    12     public abstract void handleRequest(String request);
    13 }
    14 
    15 public class ConcreteHandlerA extends Handler {
    16     @Override
    17     public void handleRequest(String request) {
    18         // TODO Auto-generated method stub
    19         System.out.println("A接受任务");
    20         if (request == "A") {
    21             System.out.println("任务已经由<" + this.getClass().getName() + ">处理");
    22         } else {
    23             System.out.println("任务A->B");
    24             Handler nexthandler = getNext();
    25             nexthandler.handleRequest(request);
    26         }
    27     }
    28 }
    29 
    30 public class ConcreteHandlerB extends Handler {
    31     @Override
    32     public void handleRequest(String request) {
    33         // TODO Auto-generated method stub
    34         System.out.println("B接受任务");
    35         if (request == "B") {
    36             System.out.println("任务已经由<" + this.getClass().getName() + ">处理");
    37         } else {
    38             System.out.println("任务B->C");
    39             Handler nexthandler = getNext();
    40             nexthandler.handleRequest(request);
    41         }
    42     }
    43 }
    44 
    45 public class ConcreteHandlerC extends Handler {
    46     @Override
    47     public void handleRequest(String request) {
    48         // TODO Auto-generated method stub
    49         System.out.println("C接受任务");
    50         if (request == "C") {
    51             System.out.println("任务已经由<" + this.getClass().getName() + ">处理");
    52         } else {
    53             System.out.println("任务处理失败,无后续任务接管");
    54             //setNext(new ConcreteHandlerC());
    55         }
    56     }
    57 }

    调用方式:

     1 //责任链
     2 public class Client {
     3     public static void main(String[] args) {
     4         //定义责任
     5         Handler handlerA = new ConcreteHandlerA();
     6         Handler handlerB = new ConcreteHandlerB();
     7         Handler handlerC = new ConcreteHandlerC();
     8         
     9         //设置责任链顺序
    10         handlerA.setNext(handlerB);
    11         handlerB.setNext(handlerC);
    12         
    13         //提交任务请求
    14         handlerA.handleRequest("D");
    15     }
    16 }

    执行结果:

    责任链是单链表数据结构的体现。

  • 相关阅读:
    kicad 基本操作
    RedHat centos中的上传下推脚本
    使用Node.js爬虫存储MySQL数据库
    解决vue和vue-template-compiler版本不同报错的问题
    Vue组件通信(父子组件通信)-学习笔记
    git 简单操作
    错误解决:redis.exceptions.ResponseError: unknown command 'SENTINEL'
    nginx做泛域名解析的域名的正则判断
    postman对字符串进行base64编码方法和变量的使用
    pymysql报错OperationalError: (2013, 'Lost connection to MySQL server during query')
  • 原文地址:https://www.cnblogs.com/asenyang/p/12111072.html
Copyright © 2020-2023  润新知