设计模式之责任链模式

来源:互联网 发布:dwg用什么软件 编辑:程序博客网 时间:2024/06/11 14:58

责任链模式

多个对象都有可能处理请求,这些对象形成一条链,请求在这条责任链上传递,直到有一个对象对该请求进行处理。发出请求的客户并不知道这个请求到底会被谁处理。

纯的责任链模式:

对于一个请求,一个处理者之后做出两种处理:一是处理该请求,二是无法处理转发给下一任处理者进行处理。请求在责任链中一定会得到处理。不允许一个处理者处理了部分责任又将责任转给下一任进行处理

不纯的责任链模式:

一个请求最终可以不被任何一个处理者进行处理。

涉及到的有:

抽象处理者角色:定义一个处理请求的接口以及一个后继者(以形成一条责任链)
具体处理者角色:实现抽象处理者角色接口
客户类(发出请求):向一条责任链上的某一个具体处理者发送请求。

举个栗子:在学校请假的情况,处理者分为任课老师—>年级辅导员—>学院院领导

请假只需要请一节课的时候,直接告诉任课老师一声就好啦~没必要去找导员要假条了
要 1天<请假时间<2周 的时候,哇!一周都不在学校,还是告诉一下辅导员吧
像博主现在这样,要在外边实习,回去上不了课了,考试的时候再回去好了~那就请3周假吧(甚至更长),辅导员说她处理不了了,去找学院院领导签字才行。

抽象处理者角色:

/** * Description:抽象处理者,定义一个处理请求的方法、后继处理者 */public abstract class IHandler {    private IHandler handler;    public abstract boolean approve(double day);    public IHandler getHandler() {        return handler;    }    public void setHandler(IHandler handler) {        this.handler = handler;    }}

具体的处理者角色:

/** * Description:任课老师,可以批准小于一天的假 */public class Teacher extends IHandler {    public boolean approve(double day) {        if(day<1){            System.out.println("请假时间为:"+day+"天,任课老师批准");            return true;        }else {            System.out.println("请假时间为:"+day+"天,任课老师无权批准,去找辅导员吧");            return getHandler().approve(day);        }    }}
/** * Description:辅导员,大于一天小于两周的假都可以批准的 */public class Instructor extends IHandler {    public boolean approve(double day) {        if(day<10){            System.out.println("请假时间为:"+day+"天,辅导员批准");            return true;        }else {            System.out.println("请假时间为:"+day+"天,辅导员无权批准,去找院领导吧");            return getHandler().approve(day);        }    }}
/** * Description:院领导,超过两周的假都是他批准的 */public class Leader extends IHandler {    public boolean approve(double day) {        System.out.println("请假时间为:"+day+"天,院领导批准");        return true;    }}

测试类:

public class Test {    public static void main(String[] args){        Teacher teacher = new Teacher();        Instructor instructor = new Instructor();        Leader leader = new Leader();        teacher.setHandler(instructor);        instructor.setHandler(leader);        System.out.println("--------遇见请假0.5天----------");        teacher.approve(0.5);        System.out.println("--------遇见请假20天----------");        teacher.approve(20);    }}

运行结果
这里写图片描述

By the way:责任链模式当中的“链”如果太长,不易于维护,所以如果责任链太长,一般采用和其他的设计模式组合使用。后续会介绍到。

原创粉丝点击