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
总结
责任链模式属于行为模式,它将具体处理请求对象与请求对象解耦。使得责任链上的对象均有机会处理来自客户端的请求。相关文章推荐
- Java经典设计模式之五大创建模式(附实例和详解)
- Java经典设计模式之七大结构型模式(附实例和详解)
- Java经典设计模式之七大结构型模式(附实例和详解)
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java经典设计模式之七大结构型模式(附实例和详解)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之十一种行为型模式(附实例和详解)
- (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)
- (转)Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java设计模式之装饰者模式详解和代码实例
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java经典设计模式之五大创建模式(附实例和详解)
- Java经典设计模式(1):五大创建型模式(附实例和详解)
- Java经典设计模式之七大结构型模式(附实例和详解)
- 实例讲解Java的设计模式编程中责任链模式的运用
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式:七大结构型模式(附实例和详解)
- java设计模式:观察者模式实例详解(基于java内置观察者)
- Java经典设计模式之五大创建型模式(附实例和详解)
- Java经典设计模式之七大结构型模式(附实例和详解)