您的位置:首页 > 编程语言 > Java开发

JAVA 设计模式实例详解之责任链模式

2017-10-22 11:46 561 查看

认识责任链模式

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

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

责任链模式的概念

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

责任链模式的设计思路

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

首先,我们需要构建一条响应对象节点链。

这些对象节点拥有一致的应对请求行为,所以我们需要为响应链制定接口/抽象类。

这些节点自身处理不了时,将请求丢给下一个节点,每个对象拥有下一个节点的引用。

以下是责任链的UML类图设计方案。



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

责任链模式的使用场景

以下条件适用于责任链模式:

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

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

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

链式结构:



责任链模式使用示例

在搭乘地铁前,我们需要购买地铁票,购票机器目前支持¥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

总结

责任链模式属于行为模式,它将具体处理请求对象与请求对象解耦。使得责任链上的对象均有机会处理来自客户端的请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: