Chain of Responsibility模式 文中的代码示例,很是复杂,有重复,方法不关注
如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);
}
}
}
这个方法明显做了两件事,而且每个具体的handler中都得这样写。
所以现在重构下,把重复的事向上提一 层,并把方法分离成两个方法
Handler改成现在这个样:
package cor2;
/**
*
* @Filename: Handler.java
* @Description:Handler 作用:请求的发送者和接受者之间解耦
* 对@see cor1.Handler 进行了重构
*/
public abstract class Handler {
//下一个处理者
protected Handler successor;
/**
* template方法
* @param request
*/
public final void handleRequest(Request request){
if(canHandle(request)){
handle(request);
}else{
if(successor!=null){
successor.handle(request);
}
}
}
/**
* 是否可以处理此request
* @param request
* @return
*/
protected abstract boolean canHandle(Request request);
/**
* 具体处理请求
* @param request
*/
protected abstract void handle(Request request);
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
具体的单个Handler
package cor2;
public class PrintHandler extends Handler {
@Override
public void handle(Request request) {
System.out.println("PrintHandler handle " + request.getClass().getSimpleName());
request.execute();
}
@Override
protected boolean canHandle(Request request) {
if (request instanceof PrintRequest) {
return true;
}
return false;
}
}
request,client不变。优雅多了。