设计模式学习总结(二十一)--责任链模式

定义

职责链模式就是避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

在职责链模式中我们可以随时随地的增加或者更改一个处理者,甚至可以更改处理者的顺序,增加了系统的灵活性。处理灵活性是增加了,但是有时候可能会导致一个请求无论如何也得不到处理,它会被放置在链末端,这个既是职责链的优点也是缺点。

角色

角色:

  • Handler: 抽象处理者。定义了一个处理请求的方法。所有的处理者都必须实现该抽象类。
  • ConcreteHandler: 具体处理者。处理它所负责的请求,同时也可以访问它的后继者。如果它能够处理该请求则处理,否则将请求传递到它的后继者。
  • Client: 客户类。

优缺点

优点:

  • 降低耦合度。它将请求的发送者和接受者解耦。
  • 简化了对象。使得对象不需要知道链的结构。
  • 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 增加新的请求处理类很方便。

缺点

  • 不能保证请求一定被接收。
  • 系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。
  • 可能不容易观察运行时的特征,有碍于除错。

实例

学生请假

请假单对象:

/**
 * 请假单
 */
public class LeaveForm {

    /** 请假天数 **/
    private  int number;

    /** 请假人 **/
    private String person;

    public LeaveForm(String person,int number){
        this.person = person;
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getPerson() {
        return person;
    }

    public void setPerson(String person) {
        this.person = person;
    }
}

抽象处理者:

/**
 * 抽象处理者
 */
public abstract class Leader {

    /** 姓名 **/
    public String name;

    /** 后续处理者 **/
    protected Leader successor;

    public Leader(String name){
        this.name = name;
    }

    public void setSuccessor(Leader successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(LeaveForm LeaveNode);

}

具体处理者:

/**
 * 辅导员
 */
public class Instructor extends Leader {
    public Instructor(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveForm LeaveNode) {
        //小于3天辅导员审批,否则传递给系主任
        if (LeaveNode.getNumber() <= 3) {
            System.out.println("辅导员" + name + "审批" + LeaveNode.getPerson()
                    + "同学的请假条,请假天数为"
                    + LeaveNode.getNumber() + "天。");
        } else {
            if (this.successor != null) {
                this.successor.handleRequest(LeaveNode);
            }
        }
    }
}

/**
 * 系主任
 */
public class DepartmentHead extends Leader {
    public DepartmentHead(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveForm LeaveNode) {
        //小于7天系主任审批,否则传递给院长
        if (LeaveNode.getNumber() <= 7) {
            System.out.println("系主任" + name + "审批" + LeaveNode.getPerson()
                    + "同学的请假条,请假天数为" + LeaveNode.getNumber() + "天。");
        } else {
            if (this.successor != null) {
                this.successor.handleRequest(LeaveNode);
            }
        }
    }
}

/**
 * 院长
 */
public class Dean extends Leader {

    public Dean(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveForm LeaveNode) {
        //小于10天院长审批,否则传递给校长
        if (LeaveNode.getNumber() <= 10) {
            System.out.println("院长" + name + "审批"
                    + LeaveNode.getPerson() + "同学的请假条,请假天数为"
                    + LeaveNode.getNumber() + "天。");
        } else {
            if (this.successor != null) {
                this.successor.handleRequest(LeaveNode);
            }
        }
    }
}

/**
 * 校长
 */
public class President extends Leader {
    public President(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveForm LeaveNode) {
        //小于15天校长长审批,否则不允批准
        if (LeaveNode.getNumber() <= 15) {
            System.out.println("校长" + name + "审批"
                    + LeaveNode.getPerson() + "同学的请假条,请假天数为"
                    + LeaveNode.getNumber() + "天。");
        } else {
            System.out.println("请假天天超过15天,不批准...");
        }
    }
}

测试:

public static void main(String[] args) {
    Leader instructor = new Instructor("冯强");       //辅导员
    Leader departmentHead = new DepartmentHead("冯晓强");    //系主任
    Leader dean = new Dean("张妲强");      //院长
    Leader president = new President("王望望");     //校长

    instructor.setSuccessor(departmentHead);       //辅导员的后续者是系主任
    departmentHead.setSuccessor(dean);             //系主任的后续者是院长
    dean.setSuccessor(president);                  //院长的后续者是校长

    //请假3天的请假条
    LeaveForm leaveNode1 = new LeaveForm("张三", 3);
    instructor.handleRequest(leaveNode1);

    //请假9天的请假条
    LeaveForm leaveNode2 = new LeaveForm("李四", 9);
    instructor.handleRequest(leaveNode2);

    //请假15天的请假条
    LeaveForm leaveNode3 = new LeaveForm("王五", 15);
    instructor.handleRequest(leaveNode3);

    //请假20天的请假条
    LeaveForm leaveNode4 = new LeaveForm("赵六", 20);
    instructor.handleRequest(leaveNode4);
}

控制台输出:

辅导员冯强审批张三同学的请假条,请假天数为3天。
院长张妲强审批李四同学的请假条,请假天数为9天。
校长王望望审批王五同学的请假条,请假天数为15天。
请假天天超过15天,不批准...

原文地址:https://www.cnblogs.com/markLogZhu/p/11582709.html

时间: 2024-08-03 03:38:06

设计模式学习总结(二十一)--责任链模式的相关文章

设计模式(十二)责任链模式

一.击鼓传花 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客一次坐定位置,由一人击鼓,击鼓的地方与传花的地方是分开的,以示公正.开始击鼓时,花束就开始依次传递,鼓声一落,如果花束在某人手中,则该人就得饮酒. 比如说,贾母.贾赦.贾政.贾宝玉和贾环是五个参加击鼓传花游戏的传花者,他们组成一个环链.击鼓者将花传给贾母,开始传花游戏.花由贾母传给贾赦,贾赦传给贾政,贾政传给贾宝玉,贾宝玉传给贾环,贾环再传给贾母,由此往复,如下图所示. 击鼓传花便是一种典型的责任链模式. 二.什么是责任链模式 责任

设计模式学习笔记之六:责任链模式

我们公司使用的Enovia PLM系统是基于SOA架构的,PLM不仅仅是SAP的主数据源头,同时还需要跟其他的系统(例如供应商的DAM系统及公司的AS400系统)保持交互,系统跟系统的数据交互通过Web Service基于SOAP来实现,具体来说,PLM需要跟如下系统保持交互: 子系统 地区/功能 AFS1 中国,意大利 AFS2 北美 AS400 遗留系统 DAM 供应商 ISR 零售 PLM发送物料主数据到SAP是通过XML文件这种载体的,SAP有个PF(PI)系统专门读取PLM生成在固定共

从真实项目中抠出来的设计模式——第三篇:责任链模式

一:现实场景 有时候在开发的过程中,我们经常会根据某个状态的值,写出很多的ifelse逻辑,比如拿项目里面的案例来说,如果当前发送的是彩信,此种状态需要如何给 实体赋值,如果是短信,邮件又是其他方式的赋值,等等此类,这种情况下一般会写出如下if判断,对吧,真实代码如下: 1 if (leaflet.CommunicationtypeEnum.HasFlag(CommunicationTypeEnum.邮件)) 2 { 3 //第三步:动态生成邮件模板 4 var styleInfo = Cach

Java设计模式菜鸟系列(十八)责任链模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018231 责任链模式(ChainOfResponsibility): 有多个对象,每个对象持有下一个对象的引用,形成一条链,请求在这条链上传递,直到某一对象决定处理该请求,但是发出者并不清楚最终哪个对象会处理该请求. 一.uml建模: 二.代码实现 /** * 责任链模式:有多个对象,每个对象持有下一个对象的引用,形成一条链, * * 请求在这条链上传递,直到某一对象决定处理该请求,

设计模式(六):责任链模式

责任链设计模式是行为设计模式之一. 责任链模式用于在软件设计中实现松散耦合,其中来自客户端的请求被传递到对象链以处理它们.然后链中的对象将自己决定谁将处理请求以及是否需要将请求发送到链中的下一个对象. JDK中的责任链模式示例 让我们看一下JDK中责任链模式的例子,然后我们将继续实现这种模式的真实例子.我们知道在try-catch块代码中我们可以有多个catch块.这里每个catch块都是处理该特定异常的处理器. 因此当try块中发生任何异常时,它会发送到第一个catch块进行处理.如果catc

面向对象的设计模式(八),责任链模式

废话不多说,最近要期末考试了,还没预习呢,下面直接进入正题. 定义:定义多个可以处理请求(承担责任)的类,并将它们连成一条链,沿着该链向下传递请求(责任),直到有能力解决问题(承担责任)的类处理之.这使得它们都有机会(看能力大小咯)处理请求. 使用场景: 一个请求有多个类可以处理,但具体由那个类处理要在运行时刻确定: 在请求不知道由谁来处理的时候,可以沿着责任链传递请求: 需要动态指定一组对象处理请求. 优点: 使得请求者和处理者之前关系解耦,提高了代码灵活性. 缺点: 影响程序的性能,尤其在递

设计模式(13)--Chain of Responsibility(责任链模式)--行为型

1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 2.模式特点: 责任链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递,请求发送者无须知道请求在何时.何处以及如何被处理,实现了请求发送者与处理者的解耦.在软件开发中,如果遇到有多个对象可

iOS设计模式解析(五)责任链模式

责任链模式:使多个对象都有机会处理请求,从而避免发送者和接受者之间发生耦合. 应用场景: 有多个对象可以处理请求,而处理程序只有在运行时才能确定 例如: 英雄联盟中伤害计算,伤害类型分为AP.AD.真实伤害(无视任何防御直接造伤害). 结构分析:整个结构就在这个攻击处理器的抽象.抽象一个属性,下一个处理器(newxHandler).抽象一个方法,处理攻击(handleAttack) 1 -(void)handleAttack:(attack *)attack{ 2 [nextHandler ha

23种设计模式(11):责任链模式

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 类型:行为类模式. 类图: 首先来看一段代码: public void test(int i, Request request){ if(i==1){ Handler1.response(request); }else if(i == 2){ Handler2.response(request); }else if(i == 3){ Handler