引用下某大的文章:
设计模式 写道
面向对象开发人员通常希望明确和减少对象间的责任,从而降低对象之间的耦合程序。这样我们的系统更加容易 修改,同时也可降低产生缺陷的风险。从某种程度上说,java语言本身能够帮助降低对象间的耦合度。客户端只能访问对象的接口,而不用关系其具体实现细 节。借助于接口这种方式,客户端只需要了解方法的功能即可。如果我们按照某种层次结构进行组织,比如组织为类责任链,客户端代码就有可能不必事先了解自己 将使用哪一个类。在这种情况下,链中的每个对象都有个方法,当客户端代码调用该方法的时候,这些对象要么执行该方法,要么沿着这条链转发该方法调用请求。
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);
}
}