首页 > 其他 > 详细

设计模式--责任链模式

时间:2020-02-17 10:38:36      阅读:78      评论:0      收藏:0      [点我收藏+]

参考:https://www.cnblogs.com/LOVE0612/p/10925314.html

==================================================================================================================================

模式:责任链(Chain of Responsibility)。

属性:行为模式。

概述:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。

目的:通过这种方式去除对象之间的耦合,设计模式的作用之一就是解决对象之间的耦合,这个必须要说一下,否则你决定很多的时候,设计模式是脱了裤子放屁。

解决问题:当前处理者处理自己的职能范围的问题,如果处理不了,传递给下一个处理者,形成链条。从业务上理解(再次强调是业务上理解),工作流或者常见的审批流非常相似。举例如果一个小型的公司普通员工、有主管、部门经理、总经理。如果普通员工请假,1天之内的主管可以审批;3天之内的部门经理审批;超过3天的,需要总经理审批。这样的设计场景中,适合责任链模式。

角色:如何实现上述的业务逻辑呢

         A、抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。对应上边例子中的“人”(含主管、部门经理,总经理,统一定位为“人”)

         B、具体处理者(Concrete Handler)备注1角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。对应上边例子具体的人,也就是具体实现。

         C、客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。个人觉的,是调用的开始点。

应用场景:下次再总结。

开源软件实现的例子:下次再总结。

 

实现例子:

A:抽象处理者(Handler)角色

 1 package comm.design;
 2 
 3 /**
 4  * 是一个公司管理者的接口,假设每天的工作为处理请假。
 5  * @author yangzhancheng
 6  *
 7  */
 8 public interface IManagerHandler {
 9 
10     /**
11      * 要处理的任务(请假)
12      */
13     public void doLeave(int leaveDays);
14     
15     /**
16      * 下一位处理者
17      * @param managerHandler
18      */
19     public void nextManagerHandler(IManagerHandler managerHandler);
20 }

B:具体处理者(Concrete Handler)--主管

 1 package comm.design;
 2 
 3 /**
 4  * 主管
 5  * @author yangzhancheng
 6  *
 7  */
 8 public class ExecutiveManageHandler implements IManagerHandler {
 9 
10     private IManagerHandler managerHandler;
11     
12     @Override
13     public void doLeave(int leaveDays) {
14         if(leaveDays<=1){
15             System.out.println("我是主管理,同意请假,请假天数:"+leaveDays);
16         }else{
17             //下一个级处理
18             System.out.println("我是主管,需要请示上级。");
19             managerHandler.doLeave(leaveDays);
20         }
21     }
22 
23     @Override
24     public void nextManagerHandler(IManagerHandler managerHandler) {
25         this.managerHandler = managerHandler;
26     }
27 
28 }

B:具体处理者(Concrete Handler)--部门经理

 1 package comm.design;
 2 
 3 /**
 4  * 部门经理
 5  * @author yangzhancheng
 6  *
 7  */
 8 public class DirectorManageHandler implements IManagerHandler {
 9 
10     private IManagerHandler managerHandler;
11     
12     @Override
13     public void doLeave(int leaveDays) {
14         if(leaveDays<=3){
15             System.out.println("我是部门经理,同意请假,请假天数:"+leaveDays);
16         }else{
17             //下一个级处理
18             System.out.println("我是部门经理,需要请示上级。");
19             managerHandler.doLeave(leaveDays);
20         }
21     }
22 
23 
24     @Override
25     public void nextManagerHandler(IManagerHandler managerHandler) {
26         this.managerHandler = managerHandler;
27     }
28 
29 }

 

B:具体处理者(Concrete Handler)--总经理

 

 1 package comm.design;
 2 
 3 /**
 4  * 总经理
 5  * @author yangzhancheng
 6  *
 7  */
 8 public class GeneralManageHandler implements IManagerHandler {
 9 
10     private IManagerHandler managerHandler;
11     
12     @Override
13     public void doLeave(int leaveDays) {
14         System.out.println("我是总经理,同意请假,请假天数:"+leaveDays);
15     }
16 
17     @Override
18     public void nextManagerHandler(IManagerHandler managerHandler) {
19         this.managerHandler = managerHandler;
20     }
21 
22 }

C:客户类(Client)角色

 1 package comm.design;
 2 
 3 /**
 4  * 调用类,注意不要死循环
 5  * @author yangzhancheng
 6  *
 7  */
 8 public class Client {
 9 
10     public static void main(String[] args) {
11     
12         //主管
13         IManagerHandler executiveManageHandler = new ExecutiveManageHandler();
14         //部门经理
15         IManagerHandler directorManageHandler  = new DirectorManageHandler();
16         //经理
17         IManagerHandler generalManageHandler = new GeneralManageHandler(); 
18         
19         //主管的领导是部门经理
20         executiveManageHandler.nextManagerHandler(directorManageHandler);
21         //部门经理的领导是经理
22         directorManageHandler.nextManagerHandler(generalManageHandler);
23         
24         //员工请5天假期
25         executiveManageHandler.doLeave(5);
26     }
27 
28 }

运行结果

我是主管,需要请示上级。
我是部门经理,需要请示上级。
我是总经理,同意请假,请假天数:5

 

总结:下次再补充。

 

备注1:这个英文不知道对不对,看大部分文章这么些,有时间再研究对不对。

设计模式--责任链模式

原文:https://www.cnblogs.com/fating/p/12319826.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!