文档章节

【行为型】- 责任链模式

ZeroneLove
 ZeroneLove
发布于 02/23 11:07
字数 1068
阅读 27
收藏 0

责任链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止(如果权限不够则直接跳转)

应用: OA权限审批

角色:

  • 抽象处理者角色(Handler:Approver):定义1个处理请求的接口,和一个后继连接(可选)

  • 具体处理者角色(ConcreteHandler:President):处理它所负责的请求,可访问后继者,如果可处理请求则处理,否则将该请求转给他的后继者

  • 客户类(Client):向一个链上的具体处理者ConcreteHandler对象提交请求。


抽象处理者角色:Approver

package com.zhiwei.responsibility;
public abstract class Approver {

    /**上级领导*/
    private Approver leader;
    public abstract void approve(BorrowBill borrowBill);

    public Approver getLeader() {
        return leader;
    }

    /**
    * 设置上一级领导:设置继任者
    * @param leader
    */
    public void setLeader(Approver leader) {
        this.leader = leader;
    }
}

具体处理者角色:ConcreteHandler

package com.zhiwei.responsibility;

/**
 * 员工类:提出收支单审批申请
 * @author Yang ZhiWei
 *
 */
public class EmployeeApprover extends Approver{

    @Override
    public void approve(BorrowBill borrowBill) {
            System.out.println("员工向部门主管申请审批借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
            super.getLeader().approve(borrowBill);
    }

}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:公司董事长
 * 权限:<5000
 * @author Yang ZhiWei
 */
public class DepartmentApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() < 5000d) {
            System.out.println("员工部门主管审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("员工部门主管权限不够,提交上一级领导审批................");
            super.getLeader().approve(borrowBill);
        }
    }
}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:财务部门经理
 * @author Yang ZhiWei
 *
 */
public class FinanceApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() >= 5000d && borrowBill.getSum() < 20000d) {
            System.out.println("财务部门经理审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("财务部门经理权限不够,提交上一级领导审批................");
            super.getLeader().approve(borrowBill);
        }
    }
}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:公司总经理
 * 权限:2000~50000
 * @author Yang ZhiWei
 *
 */
public class ManagerApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() >= 20000d && borrowBill.getSum() < 50000d) {
            System.out.println("公司总经理审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("公司总经理权限不够,提交上一级领导审批................");
            super.getLeader().approve(borrowBill);
        }
    }
}
package com.zhiwei.responsibility;

/**
 * 具体处理角色:公司董事长
 * 权限:>=50000
 * @author Yang ZhiWei
 *
 */
public class ChairmanApprover extends Approver {

    public void approve(BorrowBill borrowBill) {
        if (borrowBill.getSum() >= 50000d) {
            System.out.println("公司董事长审批了该借支单,借支单名称为:" + borrowBill.getName() + ",该借支单金额为:" + borrowBill.getSum());
        } else if (super.getLeader() != null) {
            System.out.println("公司董事长没有上级了");
        }
    }
    }

测试代码:

//设置具体的处理者
Approver employeeApprover = new EmployeeApprover();
Approver departApprover = new DepartmentApprover();
Approver financeApprover = new FinanceApprover();
Approver managerApprover = new ManagerApprover();
Approver chairmanApprover = new ChairmanApprover();

//配置处理者之间的关系: 配置上下级的关系
employeeApprover.setLeader(departApprover);
departApprover.setLeader(financeApprover);
financeApprover.setLeader(managerApprover);
managerApprover.setLeader(chairmanApprover);

//设置借支单
BorrowBill borrowBill = new BorrowBill();
borrowBill.setName("出差借支单");
borrowBill.setSum(3000d);

//执行处理流程:根据不同的情况,责任链角色根据权限的不同分别处理
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");

borrowBill.setName("出差借支单");
borrowBill.setSum(6000d);
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");
borrowBill.setName("采购办公用品借支单");
borrowBill.setSum(15000d);
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");
borrowBill.setName("采购原料借支单");
borrowBill.setSum(45000d);
employeeApprover.approve(borrowBill);

System.out.println("---------------------------");
borrowBill.setName("采购原料借支单");
borrowBill.setSum(100000d);
employeeApprover.approve(borrowBill);

通俗解释:

责任链设计模式的核心是”一步到位“处理,考虑所有情况

例如:公司请假规定:

  1. 7天之内,主管批准即可
  2. 15天之内,经理批准即可
  3. 15天,总经理批准即可

1,2,3就是责任链设计模式中的执行者,员工请假根据自己的情况依次提交主管,主管判断情况进行任务处理或任务转交给上级处理,这样不会像状态模式一样,如果卡在一个环节就无法走下去了,而责任链设计模式则可一步到位处理。

© 著作权归作者所有

ZeroneLove
粉丝 5
博文 164
码字总数 133695
作品 0
深圳
高级程序员
私信 提问
设计原则和设计模式_Index

设计原则 1.1 什么是设计原则 ?(https://my.oschina.net/jimilee/blog/732569) 1.2 设计原则如何用? 1.3 设计原则详解 1.4 30分钟快速理解面向对象设计原则 2. 设计模式 2.1 什么时候使用设...

无寄语
2016/08/14
1
0
JAVA设计模式之责任链模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起...

jiangmitiao
2016/03/01
72
0
Design Patterns in Android:责任链模式

前言 非常抱歉,本系列博客长达半年没更新了,今日偶得灵感,更新一波《设计模式Android篇:责任链模式》。点击此处查看《Design Patterns in Android》系列其他文章。 本文原创作者MichaelX。...

MichaelX
2018/10/30
0
0
Java设计模式学习记录-责任链模式

前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式)。 责任链模式 概念介绍 ...

纪莫
2018/08/16
0
0
责任链模式实现费用报销的审核

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户...

tsmyk0715
2016/07/20
10
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊Tomcat中的连接器(Connector)

上期回顾 上一篇文章《Tomcat在SpringBoot中是如何启动的》从main方法启动说起,窥探了SpringBoot是如何启动Tomcat的,在分析Tomcat中我们重点提到了,Tomcat主要包括2个组件,连接器(Conne...

木木匠
39分钟前
3
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
1K
20
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
28
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部