具体实现
package com.designmode.chainofresponsibility;
public enum RequestType {
TYPE1,TYPE2
}
package com.designmode.chainofresponsibility;
public abstract class Request {
private RequestType requestType;
private String requestName;
public Request(RequestType requestType,String requestName) {
this.requestType = requestType;
this.requestName = requestName;
}
public String getRequestName() {
return requestName;
}
public RequestType getRequestType() {
return requestType;
}
}
package com.designmode.chainofresponsibility;
public abstract class Handler {
protected Handler successor;
public Handler(Handler successor) {
this.successor = successor;
}
protected abstract void handleRequest(Request request);
}
package com.designmode.chainofresponsibility;
public class ConcreteHandler1 extends Handler{
public ConcreteHandler1(Handler successor) {
super(successor);
}
@Override
protected void handleRequest(Request request) {
if(request.getRequestType() == RequestType.TYPE1){
System.out.println(request.getRequestName()+"is handled by ConcreteHandler1");
return;
}
if(successor != null) {
successor.handleRequest(request);
}
}
}
package com.designmode.chainofresponsibility;
public class ConcreteHandler2 extends Handler{
public ConcreteHandler2(Handler successor) {
super(successor);
}
@Override
protected void handleRequest(Request request) {
if(request.getRequestType() == RequestType.TYPE2){
System.out.println(request.getRequestName()+"is handled by ConcreteHandler2");
return;
}
if(successor != null) {
successor.handleRequest(request);
}
}
}
主函数
package com.designmode.chainofresponsibility;
/**
* 责任链模式:将请求和处理解耦合,有多个处理对象可以处理请求。将这些对象连成一条链,直到有个对象去处理。
* Client:两个处理者1、2(先1后2),两个请求者1、2。
* RequestType:请求枚举类型(TYPE1\TYPE2)。
* Request:包含请求名称和请求类型。
* Handler:处理者,包含请求和之后的继任者。
* ConcreteHandler1(处理TYPE1)、ConcreteHandler2(处理TYPE2)具体的处理者。
* @author hexiaoli
*
*/
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1(null);
Request request1 = new Request(RequestType.TYPE1,"request1");
handler1.handleRequest(request1);
Handler handler2 = new ConcreteHandler2(handler1);
Request request2 = new Request(RequestType.TYPE2,"request2");
handler2.handleRequest(request2);
}
}