`
shuidexiongdi
  • 浏览: 71584 次
  • 性别: 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责任链模式详解,包含项目中应用

    qt5编写的责任链模式程序

    使用qt5编写的责任链模式程序,C++程序可以借鉴。主要介绍责任链模式的简单应用

    基于Java工厂、装饰者、策略、责任链模式的办公座椅销售系统

    利用工厂模式、装饰者模式、策略模式、责任链模式进行设计与实现。工厂模式完成办公椅不同种类的生成,装饰者模式完成给办公椅添加配件,策略模式完成不同打折算法的自动更替,责任链模式以及反射机制完成不同职位...

    modelAndLink 责任链模式 备忘录模式 单(双)链表 链表 显示“请稍后……"原理

    责任链模式 备忘录模式 单(双)链表 显示 "正在加载,请稍后……" 原理 1、责任链模式: * 责任连模式的结构 责任连模式的类图非常简单,它由一个抽象地处理类和它的一组实现类组成: * 抽象处理类:抽象处理类中...

    C#设计模式:责任链模式

     责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理。责任链模式有效组织一个过程处理,同时子过程之间职责明确。在.NET平台中很常见此...

    详解如何在C#/.NET Core中使用责任链模式

    但是有一种模式是我还没有写过文章,即责任链模式。 什么是责任链?# 责任链模式(之前我经常称之为命令链模式)是一种允许以使用分层方式”处理“对象的模式。在维基百科中的经典定义是 在面向对象设计中,责任链...

    java设计模式

    16.3.3 责任链模式的注意事项 16.4 最佳实践 第17章 装饰模式 17.1 罪恶的成绩单 17.2 装饰模式的定义 17.3 装饰模式应用 17.3.1 装饰模式的优点 17.3.2 装饰模式的缺点 17.3.3 装饰模式的应用 17.4 最佳实践 第18章...

    详解C++设计模式编程中责任链模式的应用

    主要介绍了C++设计模式编程中责任链模式的应用,责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,需要的朋友可以参考下

    iOS应用设计模式开发中职责链(责任链)模式的实现解析

    为了避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,职责链模式又称为责任链模式,它是一种对象行为型模式。(如果你接触...

    Java经典设计模式之责任链模式原理与用法详解

    主要介绍了Java经典设计模式之责任链模式,简单说明了责任链模式的概念、原理,并结合实例形式分析了java实现责任链模式的具体用法与相关注意事项,需要的朋友可以参考下

    Java模式开发之责任链模式

    从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花... 击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起

    JavaScript设计模式之职责链模式应用示例

    主要介绍了JavaScript设计模式之职责链模式,结合实例形式分析了javascript责任链模式的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下

    JAVA设计模式之行为模式

    包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor(访问模式)、Command(命令模式)的源代码,...

    Android编程设计模式之责任链模式详解

    将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种...

    chain_of_responsibility:Ruby的责任链模式实现

    责任链 安装 将此行添加到您的应用程序的Gemfile中: gem "chain_of_responsibility" 然后执行: $ bundle 或将其自己安装为: $ gem install chain_of_responsibility 关于 前段时间,我偶然发现Sergii Makagon...

    设计模式所有实验及实验报告及代码.zip

    29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的设计 38创建型模式应用实验 39结构型模式应用实验 40行为型模式应用实验 所有实验...

    C#设计模式.PDF

    五、 责任链模式的实际应用案例 163 六、 责任链模式的实现 168 设计模式(18)-Command Pattern 168 一、 命令(Command)模式 168 二、 命令模式的结构 168 三、 命令模式的示意性源代码 169 四、 玉帝传美猴王...

Global site tag (gtag.js) - Google Analytics