Java设计模式之职责链设计模式

1.什么是-职责链设计模式

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。Tomcat中的Filter就是使用了责任链模式,创建一个Filter除了要在web.xml文件中做相应配置外,还需要实现javax.servlet.Filter接口。

2.职责链设计模式的优缺点

1.1优点

1.1.1.责任链模式减低了发出命令的对象和处理命令的对象之间的耦合 
1.1.2.它允许多与一个的处理者对象根据自己的逻辑来决定哪一个处理者最终处理这个命令。换言之,发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上的哪一个节点处理了这个命令。 
1.1.3.在处理命令上,允许系统有更多的灵活性。哪一个对象最终处理一个命令可以因为由那些对象参加责任链、以及这些对象在责任链上的位置不同而有所不同。

1.2缺点

1.2.1.责任链模式要求链上所有的对象都继承自一个共同的父类或者实现一个共通的接口 
1.3.2.所有责任开始都是从指定的接收者依次传递下去,运行中无法从中间开始传递,执行顺序是一条线,如果涉及到的层级较多请求反而无法立即精确的找到处理者,处理效率会降低。

2.设计模式示例

2.1.示例背景

这里的示例是以请假审批做为背景,分别有三层角色:1、boss>2、总经理>3、部门经理>4、请假人。请假人编写请假条并提交给经理,如果请假天数为1天那么部门经理就有权限处理,2天就需要总经理审批了,当大于3天就需要boss审批了。大于5天就超出公司请假规定,不予请假了。这里要先理解层级调用的步骤过程。

2.2.代码区域

2.2.1.请假条类,用来存储请假信息-LeaveRequest.java

/**
 * 请假条-申请
 */
public class LeaveRequest {
    public LeaveRequest(){}
    public LeaveRequest(String name, Integer days) {
        this.name = name;
        this.days = days;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getDays() {
        return days;
    }

    public void setDays(Integer days) {
        this.days = days;
    }

    private String name;
    private Integer days;
}

2.2.2.抽象类,抽出各个角色共有的动作、审批请假操作-Handle.java

/**
 * 抽出角色需要执行的操作
 */
public abstract class Handle {
    private Handle hd;

    public Handle getHd() {
        return hd;
    }

    public void setHd(Handle hd) {
        this.hd = hd;
    }

    /**
     * 验证是否有审批的权力
     */
    public abstract void Approval(LeaveRequest leaveRequest);

    public Handle(Handle hd) {
        super();
        this.hd=hd;
    }

    /**
     *抽出一个公共的权限不足反馈动作
     * @param feedback
     * @param leaveRequest
     */
    public void LackAuthorityFeedback(String feedback,LeaveRequest leaveRequest){
        System.out.println(String.format("我是%s,%s请假%s天,我的权限不足,请求上级领导批准。",feedback,leaveRequest.getName(),leaveRequest.getDays()));
        this.getHd().Approval(leaveRequest);//通过每一角色类中的构造函数初始化上一级实例对象来调用上一级审批动作
    }
}

2.2.3.boss实现类,继承抽象类实现抽象方法审批请假操作-Boss .java

/**
 * Created by Administrator on 2017-12-20.
 */
public class Boss extends Handle {
    public Boss(Handle hd) {
        super(hd);
    }

    @Override
    public void Approval(LeaveRequest leaveRequest) {
        if(leaveRequest.getDays()<=5){
            System.out.println(String.format("我是老板,%s请假%s天,批准了。",leaveRequest.getName(),leaveRequest.getDays()));
        }else{
            System.out.println(String.format("我是老板,%s请假%s天,超出公司规定了不予请假",leaveRequest.getName(),leaveRequest.getDays()));

        }
    }
}

2.2.4.GeneralManager总经理实现类,继承抽象类实现抽象方法审批请假操作-GeneralManager .java

/**
 * Created by Administrator on 2017-12-20.
 */
public class GeneralManager extends Handle {
    /**
     * 使用构造函数传递当前对象的上一级-这里是总经理,上一级就是boss
     * @param hd
     */
    public GeneralManager(Handle hd) {
        super(hd);
    }

    @Override
    public void Approval(LeaveRequest leaveRequest) {
        if(leaveRequest.getDays()==2){
            System.out.println(String.format("我是总经理,%s请假%s天,批准了。",leaveRequest.getName(),leaveRequest.getDays()));
        }else{
            super.LackAuthorityFeedback("总经理",leaveRequest);
           /* System.out.println(String.format("我是总经理经理,%s请假%s天,我的权限不足,请求上级领导批准。",leaveRequest.getName(),leaveRequest.getDays()));
            super.getHd().Approval(leaveRequest);//调用上级审批验证*/
        }
    }
}

2.2.5.Manage经理实现类,继承抽象类实现抽象方法审批请假操作-Manage.java

/**
 * Created by Administrator on 2017-12-20.
 */
public class Manage extends Handle {
    /**
     * 使用构造函数传递当前对象的上一级-这里是经理,上一级就是总经理
     * @param hd
     */
    public Manage(Handle hd) {
        super(hd);
    }

    @Override
    public void Approval(LeaveRequest leaveRequest) {
        if(leaveRequest.getDays()==1){
            System.out.println(String.format("我是部门经理,%s请假%s天,批准了。",leaveRequest.getName(),leaveRequest.getDays()));
        }else{
            super.LackAuthorityFeedback("部门经理",leaveRequest);
          /*  System.out.println(String.format("我是部门经理,%s请假%s天,我的权限不足,请求上级领导批准。",leaveRequest.getName(),leaveRequest.getDays()));
            super.getHd().Approval(leaveRequest);//调用上级审批验证*/
        }
    }
}

2.2.6.测试类,即是请假人类,发起请假操作-RequestTest .java

public class RequestTest {
    public static void main(String args[]) {
        LeaveRequest leaveRequest = new LeaveRequest("张三", 7);
        Handle hdBoss = new Boss(null);//声明一个boss角色并实现抽象方法
        Handle hdManager = new GeneralManager(hdBoss);//声明一个总经理角色并传递当前角色的上一级对象实例
        Handle manager = new Manage(hdManager);//声明一个经理角色并传递当前角色的上一级对象实例
        manager.Approval(leaveRequest);//开始审批请假条信息
    }
}

2.3.测试请假

1、请假一天

我是部门经理,张三请假1天,批准了。

Process finished with exit code 0

2、请假2天

我是部门经理,张三请假2天,我的权限不足,请求上级领导批准。
我是总经理,张三请假2天,批准了。

Process finished with exit code 0

3、请假5天

我是部门经理,张三请假5天,我的权限不足,请求上级领导批准。
我是总经理,张三请假5天,我的权限不足,请求上级领导批准。
我是老板,张三请假5天,批准了。

Process finished with exit code 0

3、请假7天

我是部门经理,张三请假7天,我的权限不足,请求上级领导批准。
我是总经理,张三请假7天,我的权限不足,请求上级领导批准。
我是老板,张三请假7天,超出公司规定了不予请假

Process finished with exit code 0

执行思路总结:这就是职责链模式,权限分工明确,当你想请假1天去相个亲啥的,1天时间部门经理可以有权限给你审批,但是当你相亲成功了想多请一天两天的去一起和对象旅个游啥的,这时请假天数大>1&&<=2时就需要总经理来决定审批权力了。如果一切就绪了想结个婚啥的了。发现用了婚假还不够在请个五天啥的,这个时候加上婚假一玩就是半个月肯定需要老板审批了。如果你觉得再请一周工作日是够的那么老板肯定批了,如果一周工作日还不够肯定老板就不乐意了那老板就会说超出公司规定了。当然如果你是单身狗的话那么你就从一天开始请假得了,先去相个亲啥的。

时间: 2024-09-28 00:08:38

Java设计模式之职责链设计模式的相关文章

设计模式之职责链模式(JAVA实现)

学习netty框架时,看到有人说netty用到了设计模式的职责链模式,学习一下职责链模式,主要参考大话设计模式. 主要场景: 小菜想要加薪,向经理提出加薪请求,经理没有权限,经理交由总监处理,总监也没有权限,交由总经理处理,最后,总经理处理了,不同意. 职责链的意思就是,如果没有处理该类请求的权限,交由具有更高权限的对象处理.依次类推 这里将处理对象抽象为Handler类,经理.总监等为继承Handler的具体处理类,同时模拟客户端Client向Handler对象发出请求 类图如下 下面为具体代

图解Java设计模式之职责链模式

图解Java设计模式之职责链模式 学校OA系统的采购审批项目 :需求是 传统方案解决OA系统审批,传统的设计方案 职责链模式基本介绍 职责链模式解决OA系统采购审批 职责链模式在SpringMVC框架应用的源码 职责链模式的注意事项和细节 学校OA系统的采购审批项目 :需求是 采购员采购教学器材1)如果金额 小于等于 5000,由教学主任审批 (0<=x<=5000)2)如果金额 小于等于 10000,由院长审批(5000 < x <= 10000)3)如果金额 小于等于 3000

C++设计模式实现--职责链(Chain of Responsibility)模式

一. 概述 职责链模式: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 二. 举个例子 员工要求加薪 公司的管理者一共有三级:总经理.总监.经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监.总监的处理方式也一样,总经理可以处理所有请求.这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求. 结构图如下: 假

设计模式-行为型-职责链设计模式

一.简介 职责链设计模式是属于经典设计模式中行为型设计模式里的一种设计模式.其实这种模式 在现实生活中很多地方出现,比如说: 1.多人打牌: 上家出牌后,出牌请求到达下家,下家出牌后,下下家获得出牌机会, 在一轮后如果无人出牌,则可以从 新下一轮出牌,这样一个场景,其实就是职责链模式的原型. 2.审批流程: 再比如,一个公司的采购单审批流程,如果采购单总价在5万RMB,那么主任审核即可, 如果5-10万RMB 由副董事长审批,10-50万由董事长审批,>=50万则由董事会审批.每一个节点只负责职

java设计模式之职责链模式

[学习难度:★★★☆☆,使用频率:★★☆☆☆] "一对二","过","过"--这声音熟悉吗?你会想到什么?对!纸牌.在类似"斗地主"这样的纸牌游戏中,某人出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新的牌.在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求.在设计模式中,我们也有一种专

JAVA设计模式之 职责链模式【Chain of Responsibility Pattern】

一.概述 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.职责链模式是一种对象行为型模式. 核心在于引入一个抽象处理者类 二.适用场景 请求的链式处理,多个对象可以处理同一请求.但是具体由哪个对象来处理由运行时系统根据条件判断确定. 如请假业务场景: 三.UML类图 四.参与者 1.Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了

Java设计模式之责任链设计模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. ? 请求传递方向:从低级到高级 ? 重点:如何形成这个责任链 ? 特点:发出处理请求的客户端并不知道是系统当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任.1. 派生类中都具备的功能(1) 都要设置后继者(一样)(2) 都能实现自己职责范围

设计模式值职责链模式(行为型)

目录 一.行为型模式 二.职责链模式定义 三.职责链模式角色 四.简单实例 五.模式应用 一.行为型模式 介绍职责链模式之前先介绍一下行为型设计模式,因为按照GoF模式分类,职责链就是一种行为型设计模式.行为型设计模式就是主要表示类或者对象之间的关联关系,分为类行为型和对象行为型.类行为型一般都是通过类的继承或者多态等等方式实现.对象行为型就是通过对象的聚合等等关联实现. 二.职责链模式定义 职责链模式是一种对象行为型模式.根据"合成复用"原则,尽量使用关联来取代类继承,对象行为型可以

设计模式之职责链模式(Chain of Responsibility)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,