【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用场景:

1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;

3、处理一个请求的对象集合应被动态指定。

Handler:

package com.sjmx.responsibility.application;

public abstract class Handler {
    /**
     * 持有下一个处理请求的对象
     */
    protected Handler successor = null;

    /**
     * 取值方法
     */
    public Handler getSuccessor() {
        return successor;
    }

    /**
     * 设置下一个处理请求的对象
     */
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    /**
     * 处理聚餐费用的申请
     *
     * @param user
     *            申请人
     * @param fee
     *            申请的钱数
     * @return 成功或失败的具体通知
     */
    public abstract String handleFeeRequest(String user, double fee);
}

ProjectManager:

package com.sjmx.responsibility.application;

public class ProjectManager extends Handler {

    @Override
    public String handleFeeRequest(String user, double fee) {

        String str = "";
        // 项目经理权限比较小,只能在500以内
        if (fee < 500) {
            // 为了测试,简单点,只同意张三的请求
            if ("张三".equals(user)) {
                str = "成功:项目经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";
            } else {
                // 其他人一律不同意
                str = "失败:项目经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
            }
        } else {
            // 超过500,继续传递给级别更高的人处理
            if (getSuccessor() != null) {
                return getSuccessor().handleFeeRequest(user, fee);
            }
        }
        return str;
    }

}

DeptManager:

package com.sjmx.responsibility.application;

public class DeptManager extends Handler {

    @Override
    public String handleFeeRequest(String user, double fee) {

        String str = "";
        // 部门经理的权限只能在1000以内
        if (fee < 1000) {
            // 为了测试,简单点,只同意张三的请求
            if ("张三".equals(user)) {
                str = "成功:部门经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";
            } else {
                // 其他人一律不同意
                str = "失败:部门经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
            }
        } else {
            // 超过1000,继续传递给级别更高的人处理
            if (getSuccessor() != null) {
                return getSuccessor().handleFeeRequest(user, fee);
            }
        }
        return str;
    }

}

GeneralManager:

package com.sjmx.responsibility.application;

public class GeneralManager extends Handler {

    @Override
    public String handleFeeRequest(String user, double fee) {

        String str = "";
        // 总经理的权限很大,只要请求到了这里,他都可以处理
        if (fee >= 1000) {
            // 为了测试,简单点,只同意张三的请求
            if ("张三".equals(user)) {
                str = "成功:总经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";
            } else {
                // 其他人一律不同意
                str = "失败:总经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
            }
        } else {
            // 如果还有后继的处理对象,继续传递
            if (getSuccessor() != null) {
                return getSuccessor().handleFeeRequest(user, fee);
            }
        }
        return str;
    }

}

客户端:

package com.sjmx.responsibility.application;

public class Client {
     public static void main(String[] args) {
            //先要组装责任链
            Handler h1 = new GeneralManager();
            Handler h2 = new DeptManager();
            Handler h3 = new ProjectManager();
            h3.setSuccessor(h2);
            h2.setSuccessor(h1);  

            //开始测试
            String test1 = h3.handleFeeRequest("张三", 300);
            System.out.println("test1 = " + test1);  

            String test2 = h3.handleFeeRequest("李四", 300);
            System.out.println("test2 = " + test2);
            System.out.println("---------------------------------------");  

            String test3 = h3.handleFeeRequest("张三", 700);
            System.out.println("test3 = " + test3);
            String test4 = h3.handleFeeRequest("李四", 700);
            System.out.println("test4 = " + test4);
            System.out.println("---------------------------------------");  

            String test5 = h3.handleFeeRequest("张三", 1500);
            System.out.println("test5 = " + test5);
            String test6 = h3.handleFeeRequest("李四", 1500);
            System.out.println("test6 = " + test6);
        }  

}
test1 = 成功:项目经理同意【张三】的聚餐费用,金额为300.0元
test2 = 失败:项目经理不同意【李四】的聚餐费用,金额为300.0元
---------------------------------------
test3 = 成功:部门经理同意【张三】的聚餐费用,金额为700.0元
test4 = 失败:部门经理不同意【李四】的聚餐费用,金额为700.0元
---------------------------------------
test5 = 成功:总经理同意【张三】的聚餐费用,金额为1500.0元
test6 = 失败:总经理不同意【李四】的聚餐费用,金额为1500.0元
时间: 2024-08-10 15:00:59

【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式的相关文章

职责链模式——机房收费系统下机结账

在机房收费系统中,学生下机结账最让人头疼了.因为学生的消费时间(下机时间-上机时间-上机准备时间)有三种情况: 1.消费时间<=0,也就是下机时间与上机时间的间隔在上机准备时间范围内,这种情况是不收费的. 2.消费时间<=最少上机时间,这种情况下消费时间按照最少上机时间收费. 3.消费时间>最少上机时间,这种情况还要考虑递增单位时间.比如递增单位时间是10分钟,消费时间是42分 钟,42/10=4.....2,这种情况要按照50分钟收费. 以上消费时间就分了三种情况,更复杂的是第二种和第

状态模式与职责链模式

在学习设计模式的时候发现状态模式与职责链模式特别的相似,当时没有能理解,现在回过头来看了看,查 了查资料,明白了一点,先把自己的理解写下来,在以后的学习继续深入学习 一.状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 类图 Context类就是用户当前定义的一个状态,而抽象状态类State就是用来解决特定状态的方法,其下有很 多的子类会针对用户定义的状态不同而选择不同的子类方法:可以说抽象类State是解决Context类的方法, 它的子类是针对不同的状态而分成

职责链模式之真假美猴王

孙悟空最终还是没有能逃脱如来的手掌心,因缘注定,皈依佛门,虽没有了做齐天大圣是的逍遥快活,也没有大闹天宫时的轰轰烈烈,但是现在有了更重要的一项任务,那就是普度众生,< 西游记>第五十七回,说是"六耳猕猴"化作孙悟空的摸样,伤了唐僧,后又和孙悟空大打出手...这位假孙悟空,实力不用多说了吧,和真孙悟空一般无二,大战孙悟空,闹到上天入地下海.在唐僧那:念紧箍咒,两个都喊疼,自然看不出哪个真假:到天宫:拖塔天王拿照妖镜照,也看不出:又到观音那:观音也看不出:最后到幽冥处阎罗那:经

职责链模式vs状态模式区别

状态模式在具体状态里设置了下一状态. 而职责链模式是在客户端代码里设置了下一状态的处理对象. 如果状态模式里的任何一环缺失,将导致事情无法进行下去.职责链模式的链式在客户端连接的,也就是说,如果我们请假,请假制度一旦改变,比如说我们不需要班长,或者是先请求老师后直接请求主任或者中间多了一个环节,都是很容易实现的,所以,职责链模式要比状态模式灵活很多. 小时候写日记都是这么写的:上午七点起床,八点之前洗脸刷牙吃早饭,十二点之前好好上课,中午一点,吃午饭,下午两点到六点,上课,下课,找请假,明天妈妈

机房合作之职责链模式

经过好玩又有趣的软考备战和考试之后,终究还是要归于平静的.我们要学得东西还有很多,于是在软考结束的第二天,机房合作就马上提上了议事日程.在刚开始的时候,是一边做着新闻发布系统,一边思考合作的事宜,到了后来,逐步的过渡全身心投入机房合作的项目中去的阶段,因为我是项目组长,必须要做很多的工作,从一开始的建模到文档编写,再到敲代码,都要涉及,今天我们来讨论讨论如何在机房收费系统的费用计算上使用职责链模式. 首先我们要给出解决方案的类图 职责链模式无非就是把所有的处理对象,通过SetSuccessor(

大话设计模式Python实现-职责链模式

职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系.将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 """ 6 大话设计模式 7 设计模式--职责链模式 8 职责链模式(Chain Of Responsibility):使多个对象

设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦. 意图(Intent) 使多个对象都有机会处理请求,从而避免请求的发送者和接受者

&quot;围观&quot;设计模式(22)--行为型之职责链模式(Chain Of Responsibility Pattern)

责任链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象.每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象.该模式还描述了往该处理链的末尾添加新的处理对象的方法.----WIKIPEDIA 个人的理解 责任链模式用到了链表的数据结构,存在一定的次序性,A->B->C这样的一条链表,在责任链模式中,请求交给A进行处理,如果A处理不了交给B,B如果处理的了进行处理,否则交给C处理,模式的关键在于构建这样的一个链表

设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之状态模式(State Pattern)>http://blog.csdn.net/yanbober/article/details/45502665 概述 职责链可以是一条直线.一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求.链