责任链(Chain of Responsibility)模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上 传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态 地重新组织和分配责任。
责任链模式属于行为型设计模式之一,怎么理解责任链?责任链是可以理解成数个对象首尾连接而成,每一个节点就是一个对象,每个对象对应不同的处理逻辑,直至有一个对象响应处理请求结束。这一种模式成为责任链模式。
生活中可以找到责任链模式的原型吗?这种例子很多,比如你要去买房子,首先是销售人员(对象1)接待你,你说想要百分之3的折扣,没问题,这时销售人员就有打百分之三折扣的权限,销售人员(对象1)进行处理。这时来了一个土豪,说要买10套,要百分之五的折扣,销售人员(对象1)没有百分之五折扣的权限,必须要想上级领导,销售总监申请,销售总监(对象2)批复了申请。这时国民老公小王来了,小王说百分之十把楼盘全买了,这时销售总监(对象2)也没那么大的权限了,要向CEO申请批复。
也就是说每一个客户(Client)都由销售人员接待,客户提出不同的权限,由销售人员交给不同的对象进行递次处理。客户并不关心哪个对象处理了他的请求,这样就降低了请求发送者和接受者之间的耦合关系。
下面我们通过一个出差差旅费批准为例,实现以下责任链模式,首先定义一个抽象的领导类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.test.demo; public abstract class Leader { protected Leader nextHandler; //上一级领导 public final void handlerRequest( int money){ if (money<=limit() ){ //小于限制,可以批复 handler(money); } else { if (nextHandler!= null ){ nextHandler.handlerRequest(money); //交给上一级领导处理 } } } /* * 批款限额 */ public abstract int limit(); /* * 批款 */ public abstract void handler( int money); } |
这是一个抽象类,下面通过几个类继承它,首先是小组长类:
1
2
3
4
5
6
7
8
9
|
package com.test.demo; public class GroupLeader extends Leader { public int limit() { return 1000 ; //说明小组长有1000元的批复权限 } public void handler( int money) { System.out.println( "小组长批复了" +money); } } |
主管类:
1
2
3
4
5
6
7
8
9
10
11
|
package com.test.demo; public class Director extends Leader { @Override public int limit() { return 5000 ; } @Override public void handler( int money) { System.out.println( "主管批复了" +money); } } |
经理类:
1
2
3
4
5
6
7
8
9
10
11
|
package com.test.demo; public class Manager extends Leader { @Override public int limit() { return 10000 ; } @Override public void handler( int money) { System.out.println( "经理批复了" +money); } } |
老板类:
1
2
3
4
5
6
7
8
9
10
11
|
package com.test.demo; public class CEO extends Leader { @Override public int limit() { return Integer.MAX_VALUE; } @Override public void handler( int money) { System.out.println( "CEO批复了" +money); } } |
老板类无上限。下面来定义一个职员小张申请差旅报销:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package com.test.demo; public class XiaoZhang { public static void main(String[] args) { GroupLeader groupLeader= new GroupLeader(); Director director= new Director(); Manager manager= new Manager(); CEO ceo= new CEO(); groupLeader.nextHandler=director; director.nextHandler=manager; manager.nextHandler=ceo; groupLeader.handlerRequest( 50000 ); groupLeader.handlerRequest( 500 ); groupLeader.handlerRequest( 5000 ); } } |
小张一共像小组长申请了三笔,这时运行实例如下:
我们可以看到不同的款项由不同的对象进行了处理,小张并不关心谁处理的,他只要找小组长即可。这就是责任链模式的特点。
关于Java责任链设计模式的相关内容就给大家介绍到这里,希望对大家有所帮助!