背景:刚看到一个同事用了一堆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责任链模式详解,包含项目中应用
使用qt5编写的责任链模式程序,C++程序可以借鉴。主要介绍责任链模式的简单应用
利用工厂模式、装饰者模式、策略模式、责任链模式进行设计与实现。工厂模式完成办公椅不同种类的生成,装饰者模式完成给办公椅添加配件,策略模式完成不同打折算法的自动更替,责任链模式以及反射机制完成不同职位...
责任链模式 备忘录模式 单(双)链表 显示 "正在加载,请稍后……" 原理 1、责任链模式: * 责任连模式的结构 责任连模式的类图非常简单,它由一个抽象地处理类和它的一组实现类组成: * 抽象处理类:抽象处理类中...
责任链模式是指一个处理需要涉及多个过程或者角色参与处理,并基于某个约定组成一个链,每个过程或者角色拥有各自职责进行处理。责任链模式有效组织一个过程处理,同时子过程之间职责明确。在.NET平台中很常见此...
但是有一种模式是我还没有写过文章,即责任链模式。 什么是责任链?# 责任链模式(之前我经常称之为命令链模式)是一种允许以使用分层方式”处理“对象的模式。在维基百科中的经典定义是 在面向对象设计中,责任链...
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++设计模式编程中责任链模式的应用,责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,需要的朋友可以参考下
为了避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,职责链模式又称为责任链模式,它是一种对象行为型模式。(如果你接触...
主要介绍了Java经典设计模式之责任链模式,简单说明了责任链模式的概念、原理,并结合实例形式分析了java实现责任链模式的具体用法与相关注意事项,需要的朋友可以参考下
从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏。在酒宴上宾客依次坐定位置,由一人击鼓,击鼓的地方与传花... 击鼓传花便是责任链模式的应用。在责任链模式里,很多的对象由每一个对象对其下家的引用而联接起
主要介绍了JavaScript设计模式之职责链模式,结合实例形式分析了javascript责任链模式的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor(访问模式)、Command(命令模式)的源代码,...
将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种...
责任链 安装 将此行添加到您的应用程序的Gemfile中: gem "chain_of_responsibility" 然后执行: $ bundle 或将其自己安装为: $ gem install chain_of_responsibility 关于 前段时间,我偶然发现Sergii Makagon...
29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的设计 38创建型模式应用实验 39结构型模式应用实验 40行为型模式应用实验 所有实验...
五、 责任链模式的实际应用案例 163 六、 责任链模式的实现 168 设计模式(18)-Command Pattern 168 一、 命令(Command)模式 168 二、 命令模式的结构 168 三、 命令模式的示意性源代码 169 四、 玉帝传美猴王...