`
shuidexiongdi
  • 浏览: 73427 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

也说责任链模式应用

阅读更多
背景:刚看到一个同事用了一堆ifelse嵌套来判断是否执行最后业务逻辑,感觉很纠结,就想到能不能用责任链模式来处理这类问题。顺便记录下来备后面回顾思考
问题类似如下:
Java代码  收藏代码
    if() {  
      if() {  
        if() {  
         ....  
           doBusiness();  
        }  
      }  
    }  



于是想到了责任链,直接贴代码如下:

处理接口,对外请求处理接口
    package com.shuidexiongdi.chain;  
      
    public interface Handler {  
          
        /** 
         * 执行请求 
         * @return 一般的责任链不要求一定返回boolean,这是针对具体的例子设计的责任链模式 
         */  
        public boolean doRequest();  
          
        public void setNextHandler(Handler handler);  
      
    }  


抽象一个模板类

    package com.shuidexiongdi.chain;  
      
    import org.apache.log4j.Logger;  
      
      
    public abstract class AbstractHandler implements Handler {  
          
        private static final Logger logger = Logger.getLogger(AbstractHandler.class);  
      
        Handler nextHandler;  
      
        public boolean doRequest() {  
            logger.info(this.getClass().getName() + "start..");  
            boolean flag = this.mydo();  
            logger.info(this.getClass().getName() + "flag: " + flag);  
            //如果当前逻辑正确并且需要下一个校验,则继续,否则返回当前校验  
            if(flag && this.getNextHandler() != null) {  
                return this.getNextHandler().doRequest();  
            }  
            return flag;  
        }  
      
        public Handler getNextHandler() {  
            return this.nextHandler;  
        }  
      
        public void setNextHandler(Handler handler) {  
            this.nextHandler = handler;  
        }  
          
        /** 
         * 用于校验某个逻辑是否正确 
         * @return 
         */  
        public abstract boolean mydo();  
      
    }  



    package com.shuidexiongdi.chain;  
      
    public class OneHandler extends AbstractHandler implements Handler {  
          
        /** 
         * 用于校验某个逻辑是否正确 
         * @return 
         */  
        public boolean mydo() {  
            return true;  
        }  
          
    }  




    package com.shuidexiongdi.chain;  
      
    public class TwoHandler extends AbstractHandler implements Handler {  
      
        /** 
         * 用于校验某个逻辑是否正确 
         * @return 
         */  
        public boolean mydo() {  
            return true;  
        }  
      
    }  




    package com.shuidexiongdi.chain;  
      
    public class ThirdHandler extends AbstractHandler implements Handler {  
      
        /** 
         * 用于校验某个逻辑是否正确 
         * @return 
         */  
        public boolean mydo() {  
            return true;  
        }  
      
    }  




    package com.shuidexiongdi.chain;  
      
    /** 
     * 加入某个校验返回出错的逻辑 
     * @author dengjianquan-ghq 
     * 
     */  
    public class WrongHandler extends AbstractHandler implements Handler {  
      
        /** 
         * 用于校验某个逻辑是否正确 
         * @return 
         */  
        public boolean mydo() {  
            return false;  
        }  
      
    }  



客户端:
    package com.shuidexiongdi.chain;  
      
    public class Client {  
          
        public static void main(String[] args) {  
            doTest1();  
            doTest2();  
            doTest3();  
            doTest4();  
        }  
          
        private static void doTest1() {  
            Handler handler = new OneHandler();  
            Handler handler2 = new TwoHandler();  
            Handler handler3 = new ThirdHandler();  
            Handler wrongHandler = new WrongHandler();  
            handler.setNextHandler(handler2);  
            handler2.setNextHandler(handler3);  
            handler3.setNextHandler(wrongHandler);  
            System.out.println(handler.doRequest());  
        }  
          
        private static void doTest2() {  
            Handler handler = new OneHandler();  
            Handler handler2 = new TwoHandler();  
            Handler handler3 = new ThirdHandler();  
            handler.setNextHandler(handler2);  
            handler2.setNextHandler(handler3);  
            System.out.println(handler.doRequest());  
        }  
          
        private static void doTest3() {  
            Handler handler = new OneHandler();  
            Handler handler2 = new TwoHandler();  
            Handler handler3 = new ThirdHandler();  
            handler.setNextHandler(handler2);  
            handler2.setNextHandler(handler3);  
            handler3.setNextHandler(null);  
            System.out.println(handler.doRequest());  
        }  
          
        private static void doTest4() {  
            Handler handler = new OneHandler();  
            Handler handler2 = new TwoHandler();  
            Handler handler3 = new ThirdHandler();  
            Handler wrongHandler = new WrongHandler();  
            handler.setNextHandler(handler2);  
            handler2.setNextHandler(wrongHandler);  
            wrongHandler.setNextHandler(handler3);  
            System.out.println(handler.doRequest());  
        }  
      
    }  


分享到:
评论

相关推荐

    spring责任链模式详解

    总结来说,Spring责任链模式为开发者提供了一种优雅的方式处理请求和事件,使得系统更易于扩展和维护。通过理解和熟练运用这一模式,我们可以构建出更加灵活和可复用的组件,提高代码质量和效率。

    设计模式之责任链模式源码

    责任链模式是设计模式中的一种行为模式,它允许在对象之间建立一条处理请求的链条,每个对象都包含对请求的处理逻辑,以及将请求传递给下一个对象的能力。这种模式使得请求可以在链上的对象之间传递,直到被某个对象...

    责任链模式代码

    总结来说,"责任链模式代码"可能包含了一个用代码实现的责任链模式示例,其中可能包括请求类、抽象处理类和若干个具体处理类,以及构建链和发送请求的代码。通过对这些代码的分析和学习,我们可以更好地理解和运用...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    4. **责任链模式**:责任链模式是行为型设计模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。在这个模式中,请求沿着处理者链进行传递,每个处理者都有机会处理请求,或者将请求传递...

    设计模式-责任链模式

    责任链模式是一种行为设计模式,它允许我们把请求沿着处理者对象的链式结构进行传递,直到某个对象处理这个请求。这种模式使得我们能够将请求的...理解和掌握责任链模式对于提升iOS应用的设计质量和可维护性至关重要。

    责任链模式Demo

    责任链模式在实际开发中有很多应用,例如事件驱动编程、异步任务处理、权限控制等场景。通过这种方式,我们可以轻松地添加、删除或调整处理器,而不必更改已有的代码,大大提高了系统的可维护性和可扩展性。在...

    责任链模式学习

    下面将详细探讨责任链模式的概念、结构、优点以及在实际开发中的应用。 责任链模式的核心思想是建立一个处理请求的对象链,每个对象(处理者)都包含对下一个处理者的引用。当一个请求到来时,它会依次由链上的每一...

    责任链模式小demo

    总的来说,责任链模式提供了一种灵活的方式来组织和管理多个处理步骤,使得添加、删除或修改过滤逻辑变得简单,同时也降低了系统的耦合度。在"责任链模式小demo"中,我们能够看到这种模式的具体实现和工作原理,为...

    设计模式之责任链模式

    在Java、C#等面向对象语言中,责任链模式广泛应用于事件驱动编程、日志记录系统和工作流管理等领域。 在责任链模式中,通常有以下几个关键角色: 1. 抽象处理者(Handler):定义了一个接收到请求的接口,并可以将...

    责任链模式例子

    总结来说,责任链模式是一种行为设计模式,它使我们能够构建一个处理请求的对象链,每个对象都可以独立处理请求或传递给链中的下一个对象。这提供了一种灵活的方式来组织和扩展应用程序的处理流程,同时也降低了组件...

    设计模式之责任链模式(Chain)

    例如,在Web开发中,过滤器(Filter)机制就是一种典型的责任链模式应用,每个过滤器可以对请求进行预处理或后处理,决定是否继续传递给下一个过滤器。 总结来说,责任链模式是一种有效的解耦手段,它提供了一种...

    【设计模式】之责任链模式1

    在给定的场景中,员工请假的审批流程就是一个很好的责任链模式应用实例。例如,员工请假一天半到一天,由直接主管批准;请假一天到三天,需部门经理批准;三天到三十天,由总经理审批;超过三十天则不批准。这个过程...

    责任链模式demo

    在Java Web开发中,Filter接口就是责任链模式的一个典型应用,用于实现请求预处理和后处理功能。 在Java Web中,Filter是Servlet规范的一部分,它提供了一种在请求到达目标Servlet之前对其进行拦截和处理的方式。`...

    设计模式之责任链模式Java实现

    责任链模式(Chain of Responsibility)是一种行为设计模式,它允许将请求沿着处理者对象的链进行传递,直到某个对象能够处理这个请求为止。在Java中,我们可以通过接口和类的组合来实现这种模式。让我们深入探讨...

    责任链模式.rar 责任链模式.rar 责任链模式.rar 责任链模式.rar

    责任链模式是一种设计模式,属于行为模式类别,它在软件工程中被广泛应用于处理一系列相互关联的处理步骤,使得请求可以在一系列对象之间传递,直到找到合适的处理者。这种模式允许在不指定具体处理对象的情况下,将...

    设计模式C++学习之责任链模式(Chain of Responsibility)

    总结来说,责任链模式在C++中的应用有助于创建动态、灵活的处理流程。通过定义处理者对象的链,可以方便地添加或移除处理者,同时保持代码的整洁和模块化。在实际开发中,特别是在需要处理不同类型请求或事件的场景...

    责任链模式Simple

    在实际应用中,责任链模式常用于事件处理、权限控制、工作流系统等场景,提供了一种灵活、可扩展的方式来分发和处理各种请求。在"Simple"版本中,我们可能会看到一个简化的实现,但它展示了责任链模式的基本原理和...

    java设计模式之责任链模式

    在“java设计模式之责任链模式”的主题中,我们可以深入探讨如何在实际项目中应用责任链模式,包括但不限于以下方面: 1. **代码结构优化**:通过责任链模式,可以使代码结构更加清晰,降低类间的耦合度。 2. **可...

Global site tag (gtag.js) - Google Analytics