锁定老帖子 主题:也说责任链模式应用
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-22
背景:刚看到一个同事用了一堆ifelse嵌套来判断是否执行最后业务逻辑,感觉很纠结,就想到能不能用责任链模式来处理这类问题。 问题类似如下: 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()); } } 欢迎各位指教拍砖 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-07-22
模式 虽然好,但是 要看 时候吧,个人认为
|
|
返回顶楼 | |
发表时间:2011-07-22
treemap 写道 模式 虽然好,但是 要看 时候吧,个人认为
是的,完全赞同你的观点。请点评,此处用何种方式处理这类嵌套if方式更合理? |
|
返回顶楼 | |
发表时间:2011-07-22
client很丑,这么弄还不如那些if让人好理解,你要读了这种代码绝对有种杀人的感觉。
if量不大的话就用if吧。 大量的话有两种情况 1. 比如自定义的xml标签这样可以并行的就一起验证 2. 一个接一个的工作流式的,用command模式试试 |
|
返回顶楼 | |
发表时间:2011-07-22
k.y 写道 client很丑,这么弄还不如那些if让人好理解,你要读了这种代码绝对有种杀人的感觉。
if量不大的话就用if吧。 大量的话有两种情况 1. 比如自定义的xml标签这样可以并行的就一起验证 2. 一个接一个的工作流式的,用command模式试试 command?何解? |
|
返回顶楼 | |
发表时间:2011-07-25
设计模式也不是一定不要if else啊,得看判断条件的复杂度了,LZ 2B啊
|
|
返回顶楼 | |
发表时间:2011-07-25
不错的设计,在FilterChain使用的也比较多,可见有其发挥之处,当然这种模式也看使用场景了,如果只是为了设计而设计,就有点太过了,一般的参数判断还是使用if/else比较好,如果是涉及到业务流程的,可以使用这种设计模式.
|
|
返回顶楼 | |
发表时间:2011-07-25
one, two, third...这也太imba了
|
|
返回顶楼 | |
发表时间:2011-07-25
建议看看 Mybatis缓存中的责任链模式.
|
|
返回顶楼 | |
发表时间:2011-07-26
if else 不是毒瘤,设计模式也不是圣经,没有绝对,只有相对,大家都懂的,总之两个字“权衡”。
|
|
返回顶楼 | |