论坛首页 Java企业应用论坛

也说责任链模式应用

浏览 10913 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-22  
PS 本人第一次发帖,欢迎拍砖
背景:刚看到一个同事用了一堆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());
	}

}


欢迎各位指教拍砖


   发表时间:2011-07-22  
模式 虽然好,但是 要看 时候吧,个人认为
0 请登录后投票
   发表时间:2011-07-22  
treemap 写道
模式 虽然好,但是 要看 时候吧,个人认为

是的,完全赞同你的观点。请点评,此处用何种方式处理这类嵌套if方式更合理?
0 请登录后投票
   发表时间:2011-07-22  
client很丑,这么弄还不如那些if让人好理解,你要读了这种代码绝对有种杀人的感觉。

if量不大的话就用if吧。

大量的话有两种情况
1. 比如自定义的xml标签这样可以并行的就一起验证
2. 一个接一个的工作流式的,用command模式试试
0 请登录后投票
   发表时间:2011-07-22  
k.y 写道
client很丑,这么弄还不如那些if让人好理解,你要读了这种代码绝对有种杀人的感觉。

if量不大的话就用if吧。

大量的话有两种情况
1. 比如自定义的xml标签这样可以并行的就一起验证
2. 一个接一个的工作流式的,用command模式试试

command?何解?
0 请登录后投票
   发表时间:2011-07-25  
设计模式也不是一定不要if else啊,得看判断条件的复杂度了,LZ 2B啊
0 请登录后投票
   发表时间:2011-07-25  
不错的设计,在FilterChain使用的也比较多,可见有其发挥之处,当然这种模式也看使用场景了,如果只是为了设计而设计,就有点太过了,一般的参数判断还是使用if/else比较好,如果是涉及到业务流程的,可以使用这种设计模式.
0 请登录后投票
   发表时间:2011-07-25  
one, two, third...这也太imba了
0 请登录后投票
   发表时间:2011-07-25  
建议看看 Mybatis缓存中的责任链模式.
0 请登录后投票
   发表时间:2011-07-26  
if else 不是毒瘤,设计模式也不是圣经,没有绝对,只有相对,大家都懂的,总之两个字“权衡”。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics