本文实例讲述了Java经典设计模式之责任链模式。分享给大家供大家参考,具体如下:
责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一个接收对象处理此请求。因为请求的客户端并不知道链上最终是谁来处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,从而避免了请求发送者与请求处理者之间的耦合。
责任链械中涉及到三种角色:
1,抽象处理者角色
2,具体处理者角色
3,请求发送者
小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优惠的价格也不同,不同职位就可以形成一个处理请求的链。我们暂定: * 基层销售员,只能优惠3% * 销售经理:可以优惠5% * 销售总监:可以优惠8% * 老板(Boss):优惠10%
直接上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/** * 抽象处理者(Handler)角色:处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。 * 这个角色通常由一个Java抽象类或者Java接口实现。抽象方法handlePriceRequest()规范了子类处理请求的操作。 * @date 2015-12-24 上午11:26:56 */ public abstract class RoomRateHandler { protected RoomRateHandler mHandler; //直接由子类继承,用于传递请求 public void setPriceHandler(RoomRateHandler mHandler){ this .mHandler=mHandler; } //处理具体问题:处理价格请求 public abstract void handlePriceRequest( float discount); /** * 设置请求处理链的层次关系 ,获取处理请求的对象 * @description: * @date 2015-12-24 上午11:51:54 */ public static RoomRateHandler cretateHandler(){ RoomRateHandler salesMan= new SalesMan(); RoomRateHandler salesManager= new SalesManager(); RoomRateHandler saleDirector= new SalesDirector(); RoomRateHandler topManager= new TopManager(); salesMan.setPriceHandler(salesManager); salesManager.setPriceHandler(saleDirector); saleDirector.setPriceHandler(topManager); return salesMan; } } |
具体处理者(SalesMan)角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/** * 具体处理者(SalesMan)角色:具体处理者(SalesDirector)角色:具体处理者收到请求后,可以选择处理请求,也可以将请求传给下家(上级)。 * 具体处理者都持有对链上下家(上级)对象的引用,因此具体处理者把请求传递下去。 * @description: * @date 2015-12-24 上午11:29:16 */ public class SalesMan extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount<= 0.03 ){ System.out.format( "%s批准了:%.3f%n" , "业务员" ,discount); } else { mHandler.handlePriceRequest(discount); } } } |
具体处理者(SalesManager)角色
1
2
3
4
5
6
7
8
9
10
|
public class SalesManager extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount<= 0.08 ){ System.out.format( "%s批准了:%.3f%n" , "销售经理" ,discount); } else { mHandler.handlePriceRequest(discount); } } } |
具体处理者(SalesDirector )角色
1
2
3
4
5
6
7
8
9
10
|
public class SalesDirector extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount<= 0.05 ){ System.out.format( "%s批准了:%.3f%n" , "销售总监" ,discount); } else { mHandler.handlePriceRequest(discount); } } } |
具体处理者(TopManager)角色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/** * 具体处理者(TopManager)角色:因为当前 角色已经处于链尾,所以是最终处理了。 * @description: * @author ldm * @date 2015-12-24 上午11:29:16 */ public class TopManager extends RoomRateHandler { @Override public void handlePriceRequest( float discount) { if (discount <= 0.1 ) { System.out.format( "%s批准了:%.3f%n" , "老板" , discount); } else { System.out.format( "%s不同意:%.3f%n" , "老板" , discount); } } } |
请求发送者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * 发出请求的客户(模拟买房子的人) * @description: * @author ldm * @date 2015-12-24 上午11:35:54 */ public class Customer { private RoomRateHandler mHandler; public void setPriceHandler(RoomRateHandler mHandler) { this .mHandler = mHandler; } public void requestDiscount( float discount) { mHandler.handlePriceRequest(discount); } public static void main(String[] args) { Customer customer = new Customer(); customer.setPriceHandler(RoomRateHandler.cretateHandler()); //获取处理对象,站你面前的可能是老板,也可能是业务员... Random random = new Random(); for ( int i = 0 ; i < 8 ; i++) { // 随机构造8个买房子的人 System.out.println(i + "---" ); customer.requestDiscount(random.nextFloat()/ 10 ); //处理价格(谈判) } } } |
处理结果
如果要增加层级怎么办呢?很简单,比如增加销售主管SalesSupervisor,我们只需要新建一个类SalesSupervisor extends RoomRateHandler,实现处理方法handlePriceRequest(float discount);同时不要忘记在RoomRateHandler类中cretateHandler()中设置好对应的层级链就可以啦。
希望本文所述对大家java程序设计有所帮助。