引用下某大的文章:
设计模式 写道
Chain of Responsibility模式可让每个对象都有一次机会决定自己是否处理请求,以便于避免请求的发送者与其接收者之间的耦合。
例子:
有一次我去公司报销一下车票,同事只跟我说在15楼,但具体在哪个地方他也不清楚。于是我上了15楼一进门就开始问了一下15前台,前台MM她说她也不清 楚,可以问一下旁边的保险组,保险组是我们负责我们公司保险索赔的,其他车费报销他也不清楚。于是他就跟我们一直往前走问一下福利组,福利组知道后就告诉 我说应该知财务组报销,地点就在我后面。于是我走过去把表格填了交下车票就走了。
这段事情看似简单其实就是一个责任链模式了,每个成员组都只负责自己范围内的工作。对于范围外的工作内容可能一概不知,或只知道一点点。于是当你找保险组时,他看到车票不是在他的工作范围内时。他会把你介绍到他旁边的福利组。下面我们就用代码来解释一下他们吧:
首先定义一个请求类,这个请求类就是我需要报销车票:
1.interface Handle(处理不同事务)
package com.xuyi.responsibility; public interface Handle { public void handleRequest(Request request); }
2.三个不同部门处理不同事务
HandleBoon.java
package com.xuyi.responsibility; /** * 福利组 * @author xuyi * */ public class HandleBoon implements Handle { private Handle otherHandle; public void setOtherHandle(Handle otherHandle) { this.otherHandle = otherHandle; } public void handleRequest(Request request) { System.out.println("访问福利组"); if(request.getType().equals("福利")){ System.out.println("在福利组获取福利"); request.setFinished(true); }else{ if(otherHandle!=null&&!request.isFinished()) otherHandle.handleRequest(request); } } }
HandleInsure.java
package com.xuyi.responsibility; /** * 医疗组 * @author xuyi * */ public class HandleInsure implements Handle { private Handle otherHandle; public void setOtherHandle(Handle otherHandle) { this.otherHandle = otherHandle; } public void handleRequest(Request request) { System.out.println("访问医疗组"); if(request.getType().equals("医保")){ System.out.println("在医疗组获取医保"); request.setFinished(true); }else{ if(otherHandle!=null&&!request.isFinished()) otherHandle.handleRequest(request); } } }
HandleFinance.java
package com.xuyi.responsibility; /** * 财务组 * @author xuyi * */ public class HandleFinance implements Handle { private Handle otherHandle; public void setOtherHandle(Handle otherHandle) { this.otherHandle = otherHandle; } public void handleRequest(Request request) { System.out.println("访问财务组"); if(request.getType().equals("车费")){ System.out.println("在财务组获取车费"); request.setFinished(true); }else{ if(otherHandle!=null&&!request.isFinished()) otherHandle.handleRequest(request); } } }
3.发出的请求
Request.java
package com.xuyi.responsibility; /** * 请求事务 * @author xuyi * */ public class Request { private String type; private boolean finished; public boolean isFinished() { return finished; } public void setFinished(boolean finished) { this.finished = finished; } public String getType() { return type; } public void setType(String type) { this.type = type; } }
4.Test.java
package com.xuyi.responsibility; //Chain of Responsibility模式(责任链模式) public class Test { public static void main(String[] args) { HandleBoon handleBoon = new HandleBoon(); HandleInsure handleInsure = new HandleInsure(); HandleFinance handleFinance = new HandleFinance(); //装载链条 handleBoon.setOtherHandle(handleInsure); handleInsure.setOtherHandle(handleFinance); //发出请求 Request request = new Request(); request.setType("医保"); handleBoon.handleRequest(request); } }