设计模式 写道
Chain of Responsibility模式可让每个对象都有一次机会决定自己是否处理请求,以便于避免请求的发送者与其接收者之间的耦合。
例子:
有一次我去公司报销一下车票,同事只跟我说在15楼,但具体在哪个地方他也不清楚。于是我上了15楼一进门就开始问了一下15前台,前台MM她说她也不清楚,可以问一下旁边的保险组,保险组是我们负责我们公司保险索赔的,其他车费报销他也不清楚。于是他就跟我们一直往前走问一下福利组,福利组知道后就告诉我说应该知财务组报销,地点就在我后面。于是我走过去把表格填了交下车票就走了。
这段事情看似简单其实就是一个责任链模式了,每个成员组都只负责自己范围内的工作。对于范围外的工作内容可能一概不知,或只知道一点点。于是当你找保险组时,他看到车票不是在他的工作范围内时。他会把你介绍到他旁边的福利组。下面我们就用代码来解释一下他们吧:
首先定义一个请求类,这个请求类就是我需要报销车票
public class Request {
private String type;//请求类型
private boolean finished = false;//是否已经完成任务了
public Request(String type){
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isFinished() {
return finished;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
}
同时建立一个处理类,这个类就是每个成员组必须实现的接口,这也是他的工作内容和工作方式:
public interface Handle {
public void handleRequest(Request request);
}
于是我们分别实现福利组,保险组跟财务组
/**
* 福利组
* @author Administrator
*
*/
public class HandleBoon implements Handle{
private Handle otherHandle;
public void handleRequest(Request request) {
System.out.println("............com to HandleBoon");
if(request.getType().indexOf("福利")>=0){
System.out.println("HandleBoon handle");
request.setFinished(true);
}else{
System.out.println("............HandleBoon don't know,go to other");
if(otherHandle!=null)
otherHandle.handleRequest(request);
}
}
public void setOtherHandle(Handle otherHandle) {
this.otherHandle = otherHandle;
}
}
/**
* 保险医疗索赔组
* @author Administrator
*
*/
public class HandleInsure implements Handle{
private Handle otherHandle;
public void handleRequest(Request request) {
System.out.println("............com to HandleInsure");
if(request.getType().indexOf("车票")>=0){
System.out.println("HandleInsure handle");
request.setFinished(true);
}else{
System.out.println("............HandleInsure don't know,go to other");
if(otherHandle!=null)
otherHandle.handleRequest(request);
}
}
public void setOtherHandle(Handle otherHandle) {
this.otherHandle = otherHandle;
}
}
/**
* 财务组
* @author Administrator
*
*/
public class HandleFinance implements Handle{
private Handle otherHandle;
public void handleRequest(Request request) {
System.out.println("............com to HandleFinance");
if(request.getType().indexOf("财务")>=0){
System.out.println("HandleFinance handle");
request.setFinished(true);
}else{
System.out.println("............HandleFinance don't know,go to other");
if(otherHandle!=null)
otherHandle.handleRequest(request);
}
}
public void setOtherHandle(Handle otherHandle) {
this.otherHandle = otherHandle;
}
}
实现完成之后我们写一个测试来实现我的报销流程吧:
public class Test {
public static void main(String[] args) {
HandleBoon hb = new HandleBoon();
HandleFinance hf = new HandleFinance();
HandleInsure hi = new HandleInsure();
hb.setOtherHandle(hf);
hf.setOtherHandle(hi);
List<Handle> list = new ArrayList<Handle>();
list.add(hb);
list.add(hf);
list.add(hi);
Request request = new Request("车票");
for(Handle handle:list){
if(!request.isFinished()){
handle.handleRequest(request);
}else{
break;
}
}
}
}
首先我知道是15楼,如果成员组他们彼此都不知道自己的话,那么我必须走遍15楼的去找财务组(假设当初我是不知道的)才能报销我的发票。
小结:
当应用了责任链模式之后,客户不必事先知道对象集合中哪些可提供自己所需要的服务。当客户发出请求调用之后,该请求会沿着责任链转发,直到找到提供该服务的对象为止。这样可大大降低客户端代码与提供服务的对象之间的耦合程序。