Chain Of Responsibility Pattern:很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
1).
Handler.java
package com.flyinh.ihandler;
public interface Handler {
void handleRequest(String str);
}
HandlerA.java
package com.flyingh.handler;
import com.flyinh.ihandler.Handler;
public class HandlerA implements Handler {
private Handler successor;
public HandlerA(Handler successor) {
super();
this.successor = successor;
}
@Override
public void handleRequest(String str) {
// TODO Auto-generated method stub
if(str.equals("A")){
System.out.println("HandlerA.handleRequest()");
}else{
successor.handleRequest(str);
}
}
}
HandlerB.java
package com.flyingh.handler;
import com.flyinh.ihandler.Handler;
public class HandlerB implements Handler {
private Handler successor;
public HandlerB(Handler successor) {
super();
this.successor = successor;
}
@Override
public void handleRequest(String str) {
// TODO Auto-generated method stub
if (str.equals("B")) {
System.out.println("HandlerB.handleRequest()");
} else {
successor.handleRequest(str);
}
}
}
HandlerC.java
package com.flyingh.handler;
import com.flyinh.ihandler.Handler;
public class HandlerC implements Handler {
private Handler successor;
public HandlerC(Handler successor) {
super();
this.successor = successor;
}
@Override
public void handleRequest(String str) {
// TODO Auto-generated method stub
if (str.equals("C")) {
System.out.println("HandlerC.handleRequest()");
} else {
successor.handleRequest(str);
}
}
}
OtherHandler.java
package com.flyingh.handler;
import com.flyinh.ihandler.Handler;
public class OtherHandler implements Handler {
@Override
public void handleRequest(String str) {
// TODO Auto-generated method stub
System.out.println("OtherHandler.handleRequest()");
}
}
Client.java
package com.flyingh.client;
import com.flyingh.handler.HandlerA;
import com.flyingh.handler.HandlerB;
import com.flyingh.handler.HandlerC;
import com.flyingh.handler.OtherHandler;
import com.flyinh.ihandler.Handler;
public class Client {
public static void main(String[] args) {
Handler handler = new HandlerA(new HandlerC(new HandlerB(
new OtherHandler())));
handler.handleRequest("B");
System.out.println("************");
handler.handleRequest("C");
System.out.println("************");
handler.handleRequest("A");
System.out.println("************");
handler.handleRequest("D");
}
}
程序运行结果如下:
HandlerB.handleRequest()
************
HandlerC.handleRequest()
************
HandlerA.handleRequest()
************
OtherHandler.handleRequest()
2).
Handler.java
package com.flyingh.ihandler;
import com.flyingh.irequest.Request;
public interface Handler {
void handleRequest(Request request);
}
Request.java
package com.flyingh.irequest;
public interface Request {
}
RequestA.java
package com.flyingh.request;
import com.flyingh.irequest.Request;
public class RequestA implements Request {
}
RequestB.java
package com.flyingh.request;
import com.flyingh.irequest.Request;
public class RequestB implements Request {
}
RequestC.java
package com.flyingh.request;
import com.flyingh.irequest.Request;
public class RequestC implements Request {
}
OtherRequest.java
package com.flyingh.request;
import com.flyingh.irequest.Request;
public class OtherRequest implements Request {
}
HandlerA.java
package com.flyingh.handler;
import com.flyingh.ihandler.Handler;
import com.flyingh.irequest.Request;
import com.flyingh.request.RequestA;
public class HandlerA implements Handler {
private Handler successor;
public HandlerA(Handler successor) {
super();
this.successor = successor;
}
@Override
public void handleRequest(Request request) {
// TODO Auto-generated method stub
if (request instanceof RequestA) {
System.out.println("HandlerA.handleRequest()");
} else {
successor.handleRequest(request);
}
}
}
HandlerB.java
package com.flyingh.handler;
import com.flyingh.ihandler.Handler;
import com.flyingh.irequest.Request;
import com.flyingh.request.RequestB;
public class HandlerB implements Handler {
private Handler successor;
public HandlerB(Handler successor) {
super();
this.successor = successor;
}
@Override
public void handleRequest(Request request) {
// TODO Auto-generated method stub
if (request instanceof RequestB) {
System.out.println("HandlerB.handleRequest()");
} else {
successor.handleRequest(request);
}
}
}
HandlerC.java
package com.flyingh.handler;
import com.flyingh.ihandler.Handler;
import com.flyingh.irequest.Request;
import com.flyingh.request.RequestC;
public class HandlerC implements Handler {
private Handler successor;
public HandlerC(Handler successor) {
super();
this.successor = successor;
}
@Override
public void handleRequest(Request request) {
// TODO Auto-generated method stub
if (request instanceof RequestC) {
System.out.println("HandlerC.handleRequest()");
} else {
successor.handleRequest(request);
}
}
}
OtherHandler.java
package com.flyingh.handler;
import com.flyingh.ihandler.Handler;
import com.flyingh.irequest.Request;
public class OtherHandler implements Handler {
@Override
public void handleRequest(Request request) {
// TODO Auto-generated method stub
System.out.println("OtherHandler.handleRequest()");
}
}
Client.java
package com.flyingh.client;
import com.flyingh.handler.HandlerA;
import com.flyingh.handler.HandlerB;
import com.flyingh.handler.HandlerC;
import com.flyingh.handler.OtherHandler;
import com.flyingh.ihandler.Handler;
import com.flyingh.irequest.Request;
import com.flyingh.request.OtherRequest;
import com.flyingh.request.RequestA;
import com.flyingh.request.RequestB;
import com.flyingh.request.RequestC;
public class Client {
public static void main(String[] args) {
Handler handler = new HandlerA(new HandlerC(new HandlerB(
new OtherHandler())));
Request requestB = new RequestB();
handler.handleRequest(requestB);
System.out.println("***************");
Request requestA = new RequestA();
handler.handleRequest(requestA);
System.out.println("***************");
Request requestC = new RequestC();
handler.handleRequest(requestC);
System.out.println("***************");
Request otherRequest = new OtherRequest();
handler.handleRequest(otherRequest);
}
}
程序运行结果如下:
HandlerB.handleRequest()
***************
HandlerA.handleRequest()
***************
HandlerC.handleRequest()
***************
OtherHandler.handleRequest()