`

Chain of Responsibility模式

阅读更多

对于cor模式,设计模式之Chain of Responsibility 文章已经讲述了cor的好处,以及如何使用。

说白了,就是推卸责任,一直推到一个能担当此责任的。此模式是个行为模式

《java与模式》书中讲述:

模 式意图:将多个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。客户端并不知道链上的哪个对象最终处理这个请求,从而降低了请求的发 送者和接 收者之间的耦合关系。

职责链设计模式 大概有三个角色:
(1)请求(
Request ):封装请 求信息
(2) 处理器(
Handler ): 处理请求(Request),一个具体处理器一般只处理一种请 求,如果它不能处理传递过来的请求,那么它就把该请求传递给职责链中的下一个处理器(后继处理器 successor)。
(3)客户端(
Client ): 发送请求

对 于handler的作用, 是模式的核心理念所在,解耦就得引入第三方,通过handler连接client与 request,达到解耦功能。

这是模式常用伎俩。

package cor1;

/**
 * 
 * @Filename: Handler.java
 * @Description:Handler 作用:请求的发送者和接受者之间解耦
 */
public abstract class Handler {
	
	//下一个处理者
	protected Handler successor;
	
	/**
	 * 具体处理请求
	 * @param request
	 */
	public  abstract void handleRequest(Request request);
	

	public Handler getSuccessor() {
		return successor;
	}

	public void setSuccessor(Handler successor) {
		this.successor = successor;
	}
	
	
}
package cor1;

public interface Request {
	/**
	 * 请求具体行为
	 */
	public void execute();
}
package cor1;

public class PrintHandler extends Handler {

	@Override
	public void handleRequest(Request request) {
		if (request instanceof PrintRequest) {
			request.execute();
		} else {
			System.out.println("PrintHandler can't handle " + request.getClass().getSimpleName());
			if (successor != null) {
				successor.handleRequest(request);
			}
		}
	}

}
package cor1;

public class SaveHandler extends Handler {

	@Override
	public void handleRequest(Request request) {
		if (request instanceof SaveRequest) {
			request.execute();
		} else {
			System.out.println("SaveHandler can't handle " + request.getClass().getSimpleName());

			if (successor != null) {
				successor.handleRequest(request);
			}
		}
	}

}
package cor1;

public class PrintRequest implements Request{

	@Override
	public void execute() {
		System.out.println("print request");
	}
}
package cor1;

public class SaveRequest implements Request{

	/* (non-Javadoc)
	 * @see cor1.Request#execute()
	 */
	@Override
	public void execute() {
		System.out.println("save request");
	}

}
package cor1;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Handler ph = new PrintHandler();
		Handler sh = new SaveHandler();
		ph.setSuccessor(sh);
		sh.setSuccessor(ph);
		
		Request pr = new PrintRequest();
		Request sr = new SaveRequest();
		
		ph.handleRequest(pr);
		ph.handleRequest(sr);
		
		sh.handleRequest(pr);
		sh.handleRequest(sr);
	}

}

 

转自:http://www.java1995.cn/blog/item/119

0
0
分享到:
评论
1 楼 茶是树叶 2010-10-28  
我想请教一下:你的例子是两个handler,假如要是10个,100个handler呢?是不是每个handler都要setSuccessorN次,这不是很麻烦吗?
望答复
谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics