• 责任链模式---11


    转自: https://blog.csdn.net/qian520ao/article/details/73558275

    Java设计模式——责任链模式(Chain of Responsibility)

    责任链
    责任链模式通俗来说就是关联一串能够处理事务的对象,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。【view事件处理】【okhttp interceptors】

    【抽象处理者】Handler : 定义出一个处理请求的接口,抽象方法handleRequest()规范子类处理请求的操作。
    【具体处理者】ConcreteHandler : 具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
    【客户端】Client : 设置不同的具体处理者的层级。


    结构类图

     


    举例【周杰伦事务的责任链】
    周杰伦每天都要接收到成千上万个邮件,其中还包括一些垃圾邮件,比如什么房地产啊,英语啊,健身的。除了完了垃圾邮件,剩下的邮件再由经纪人进行筛选,经纪人不能处理的邮件转由方文山去处理,同理,如果是作词相关的信息就由方文山来处理,最后剩下的再发给周杰伦(周杰伦也可以不处理)

    【智能机器管家】 : 处理无用的垃圾邮件
    【大妮】 : 处理负面新闻
    【方文山】 : 御用文人,执笔写歌词
    【周杰伦】 : 如果前面几个人都没有解决,就由自己处理该邮件。【自己也可以不处理】

    抽象Handler定义规范

     1 public abstract class Handler {
     2     private Handler successor;
     3 
     4     public Handler getSuccessor() {
     5         return successor;
     6     }
     7 
     8     public void setSuccessor(Handler successor) {
     9         this.successor = successor;
    10     }
    11 
    12     abstract Response handlerRequest(String msgChain);
    13 }
    View Code

    大佬们处理的“邮件”Response

     1 public class Response {
     2     public Response(String msg, String dealMan) {
     3         this.msg = msg;
     4         this.dealMan = dealMan;
     5     }
     6     private String msg;
     7     private String dealMan;
     8     public String getMsg() {
     9         return msg;
    10     }
    11     public String getDealMan() {
    12         return dealMan;
    13     }
    14 }
    View Code

    【处理垃圾信息的管家】

     1 public class RubbishHandler extends Handler {
     2 
     3     @Override
     4     Response handlerRequest(String msgChain) {
     5         if (msgChain.contains("安利") || msgChain.contains("健身吗靓仔") || msgChain.contains("信用卡办理")) {
     6             return new Response("清空垃圾信息", "智能机器管家");
     7         } else {
     8             return getSuccessor().handlerRequest(msgChain);
     9         }
    10     }
    11 }
    View Code

    【处理负面新闻的大妮】

     1 public class NegativeHanlder extends Handler {
     2 
     3     @Override
     4     Response handlerRequest(String msgChain) {
     5         if (msgChain.contains("卓伟") || msgChain.contains("赵五儿") || msgChain.contains("宋祖德")) {
     6             return new Response("马上拿1000万封口费", "大妮");
     7         } else {
     8             return getSuccessor().handlerRequest(msgChain);
     9         }
    10     }
    11 }
    View Code

    【御用创作文人方文山】

     1 public class TalentedHanlder extends Handler {
     2 
     3     @Override
     4     Response handlerRequest(String msgChain) {
     5         if (msgChain.contains("张惠妹") || msgChain.contains("林夕") || msgChain.contains("张学友")) {
     6             return new Response("执笔写歌词", "方文山");
     7         } else {
     8             return getSuccessor().handlerRequest(msgChain);
     9         }
    10     }
    11 }
    View Code

    【周杰伦亲自出马】

    1 public class JayHanlder extends Handler {
    2 
    3     @Override
    4     Response handlerRequest(String msgChain) {
    5         return new Response("媳妇,别闹", "周杰伦");
    6     }
    7 }
    View Code

    【看一下客户端的处理】

     1 public class Test {
     2     public static void main(String args[]) {
     3         Handler rubbishHandler = new RubbishHandler();//创建Handler实例
     4         Handler negativeHanlder = new NegativeHanlder();
     5         Handler talentedHanlder = new TalentedHanlder();
     6         Handler jayHanlder = new JayHanlder();
     7 
     8         rubbishHandler.setSuccessor(negativeHanlder);//然后关联层级
     9         negativeHanlder.setSuccessor(talentedHanlder);
    10         talentedHanlder.setSuccessor(jayHanlder);
    11 
    12 
    13         Response response_new = rubbishHandler.handlerRequest("周杰伦先生你好,我是卓伟,我这边有一张侯佩琴的...");
    14         System.out.println(response_new.getDealMan() + "【处理了该事件】" + response_new.getMsg());
    15 
    16         Response response_new2 = rubbishHandler.handlerRequest("昆凌说老周啊,该生三胎了啊");
    17         System.out.println(response_new2.getDealMan() + "【处理了该事件】" + response_new2.getMsg());
    18 
    19     }
    20 
    21 }
    View Code

    总结
    责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中

    责任链优点
    解耦请求者和发送者。
    简化具体责任对象,因为它不知道链的结构,只要处理自己对应的工作即可。
    可以动态的增加或者删除责任对象。
    责任链缺点
    并不能保证请求一定会被执行,可能落到链尾之外【可以是优点也可以是缺点】
    如果出错,不太容易除错。可能需要到每个具体的责任对象一 一排查。
    一个责任链需要整个具体责任链对象遍历,然后设置不同的层级。

  • 相关阅读:
    Memcached
    sleep和wait的区别
    基于.net Core+EF Core项目的搭建(一)
    .net Core中使用AutoMapper
    发布.net core应用程序并部署到IIS上
    IoC原理-使用反射/Emit来实现一个最简单的IoC容器
    浅谈(IOC)依赖注入与控制反转(DI)
    使用MD5加密字符串
    C#中HttpWebRequest的用法详解
    学习memcached的一个网站
  • 原文地址:https://www.cnblogs.com/Hermioner/p/10974506.html
Copyright © 2020-2023  润新知