对于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);
}
}