【设计模式】之责任链模式

版权声明:欢迎转载,但是请附上原文链接! https://blog.csdn.net/zixiao217/article/details/78308996

##认识责任链模式

在Design Patterns 一书中将Chain of Responsibility 责任链模式归类为行为模式。

行为模式涉及到算法和对象职责的分配。行为模式不仅描述对象或类的关系,还描述他们之间的通信模式。行为模式刻画了在运行时难以跟踪的复杂的控制流,它们将你的注意力从控制流转移到对象间的联系方式上来。

###责任链模式的概念

责任链模式提供了请求对象与响应对象之间的松耦合。它通过由多个响应对象构建出一条响应链,请求对象的请求处理均可以由链中的某个对象处理。

##责任链模式的设计思路

责任链模式的想法是:给多个对象处理一个请求的机会,从而解耦发送者与接受者。从第一个对象开始,响应链中的收到请求的对象要么处理它,要么转发给下一个节点。

  • 首先,我们需要构建一条响应对象节点链。
  • 这些对象节点拥有一致的应对请求行为,所以我们需要为响应链制定接口/抽象类。
  • 这些节点自身处理不了时,将请求丢给下一个节点,每个对象拥有下一个节点的引用。
    以下是责任链的UML类图设计方案。
![这里写图片描述](https://img-blog.csdn.net/20171022102324301?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveml4aWFvMjE3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

Client发送一个请求到链中的某个对象,该对象能处理则处理之,否则将请求交给该对象的下一个节点对象去处理,直到有一个节点能处理。或者没有一个节点能够处理则终止处理。

##责任链模式的使用场景
以下条件适用于责任链模式:

  • 多个对象可以处理一个请求,具体那个对象处理可以在运行时确定。

  • 在不明确具体处理者时,向多个请求对象中的一个提交一个请求。

  • 可处理一个请求的对象集合可以被动态指定。

链式结构:

![这里写图片描述](https://img-blog.csdn.net/20171022103752493?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveml4aWFvMjE3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

##责任链模式使用示例

在搭乘地铁前,我们需要购买地铁票,购票机器目前支持¥10、¥5、¥1三种币型。购票机响应购票找零请求时,我们就可以采用责任链模式处理。

分析: 币型 ¥10、¥5、¥1,可以抽象化为同一类型;
金额大于10,则先处理10,再处理剩下的;
剩下的金额大于5再处理5,剩下的就按1处理。

首先,定义处理对象类型 HandlerI:

package byron4j.designPattern.chainRes;


public interface HandlerI {
	
	
	void handleRequest(int amt) throws Exception;
}

定义处理对象实现:

package byron4j.designPattern.chainRes;

public class Handler10 implements HandlerI{
	
	private static final int defaultDenomination= 10;
	
	private static HandlerI nextHandler = new Handler5();

	@Override
	public void handleRequest(int amt) throws Exception {
		int cnt10 = amt / defaultDenomination ;
		
		if( cnt10 > 0 ) {
			System.out.println("¥10:" + cnt10);
			amt = amt % 10;
			handleRequest(amt);
		}else {
			nextHandler.handleRequest(amt);
		}
	}
	
}

package byron4j.designPattern.chainRes;

public class Handler5 implements HandlerI{
	private static final int defaultDenomination= 5;
	
	private static HandlerI nextHandler = new Handler1();

	@Override
	public void handleRequest(int amt) throws Exception {
		
		int cnt5 = amt / defaultDenomination ;
		
		if( cnt5 > 0 ) {
			System.out.println("¥5:" + cnt5);
			amt = amt % 5;
			handleRequest(amt);
		}else {
			nextHandler.handleRequest(amt);
		}
	}
	
}

package byron4j.designPattern.chainRes;

public class Handler1 implements HandlerI{
	
	private static final int defaultDenomination= 1;
	
	@Override
	public void handleRequest(int amt) throws Exception {
		int cnt1 = amt / defaultDenomination ;
		
		if( cnt1 > 0 ) {
			System.out.println("¥1:" + cnt1);
			amt = amt % 5;
		}
	}
	
}

控制台输入金额,打印责任链处理结果:

package byron4j.designPattern.chainRes;

import java.util.Scanner;

public class ChainResMain {
	
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		HandlerI handler = new Handler10();
		for(;;) {
			int amt = s.nextInt();
			try {
				handler.handleRequest(amt);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}
}

运行结果如下:

11
¥10:1
¥1:1
3
¥1:3
5
¥5:1
10
¥10:1
6
¥5:1
¥1:1
17
¥10:1
¥5:1
¥1:2
34
¥10:3
¥1:4

##总结

责任链模式属于行为模式,它将具体处理请求对象与请求对象解耦。使得责任链上的对象均有机会处理来自客户端的请求。

猜你喜欢

转载自blog.csdn.net/zixiao217/article/details/78308996