`
行者买刀
  • 浏览: 191497 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

设计模式之略见一斑(Chain of Responsibility责任链模式)

    博客分类:
  • J2SE
阅读更多

设计模式 写道

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

 

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楼的去找财务组(假设当初我是不知道的)才能报销我的发票。

 

 

小结:

  当应用了责任链模式之后,客户不必事先知道对象集合中哪些可提供自己所需要的服务。当客户发出请求调用之后,该请求会沿着责任链转发,直到找到提供该服务的对象为止。这样可大大降低客户端代码与提供服务的对象之间的耦合程序。

 

 

 

4
0
分享到:
评论

相关推荐

    设计模式之略见一斑(Observer观察者模式)

    NULL 博文链接:https://lgh3292.iteye.com/blog/600905

    21种设计模式略见一斑

    NULL 博文链接:https://teddywang.iteye.com/blog/769122

    循环冗余校验-概念 算法 应用

    CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。

    CRC16或32校验

    CRC的全称为Cyclic Redundancy Check,中文名称为循环冗余校验。它是一类重要的线性分组码,编码...例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑

    CRC算法和实现

    例如我们读软盘上的文件,以及解压一个ZIP文件时,偶尔会碰到“Bad CRC”错误,由此它在数据存储方面的应用可略见一斑。 差错控制理论是在代数理论基础上建立起来的。这里我们着眼于介绍CRC的算法与实现,对原理只能...

Global site tag (gtag.js) - Google Analytics