设计模式 写道
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楼的去找财务组(假设当初我是不知道的)才能报销我的发票。
小结:
当应用了责任链模式之后,客户不必事先知道对象集合中哪些可提供自己所需要的服务。当客户发出请求调用之后,该请求会沿着责任链转发,直到找到提供该服务的对象为止。这样可大大降低客户端代码与提供服务的对象之间的耦合程序。