设计模式——责任链模式

什么都不说了,先来一张图看看今天我们要介绍的东西,跟下面的东西还是有关的,那就是一个链字,下图是一个项链,而我要介绍的则是责任链模式。
这里写图片描述
责任链模式就是:将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能处理则处理,如果不能处理则传递给链上的下一个对象。
责任链模式的适用性:
1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2.你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3.可处理一个请求的对象集合应被动态指定。
责任链模式的参与者:
1.抽象处理者角色:定义一个处理请求的接口,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
2.具体处理者角色:处理它所负责的请求,可访问它的后继者, 如果可处理该请求,就处理它;否则将该请求转发给它的后继者。
3.发布请求者角色:向链上的具体处理者对象提交请求。
责任链不只是在代码里面呈现,在我们的生活中也是存在的,接力比赛、公司请假审批、斗地主、传递情书等等很多很多。
下面我们就以学生请假审批流程为例:
1.当学生请假的天数小于等于三天的时候有辅导员审批
2.当学生请假的天数大于三天小于等于七天的有院长审批
3.当学生请假的天数大于七天小于等于三十天的有教务处审批
4.当学生请假的天数大于三十天小于等于九十天的有校长审批
5.当学生请假的天数大于九十天的滚犊子明年等着重修吧
上面的流程只是为了实现例子具体的请假时间我不太确定!O(∩_∩)O哈哈~
开始代码
抽象处理者角色类RequestHandler.class

/**
 * 抽象处理者角色
 */
public abstract class RequestHandler {
    private String name;
    //设置责任链上后面的处理者
    RequestHandler hander;

    /**
     * 处理请求的方法
     */
    abstract void handleFeeRequest(Requester requester);
    public RequestHandler(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public RequestHandler getHander() {
        return hander;
    }
    public void setHander(RequestHandler hander) {
        this.hander = hander;
    }

}

发布请求者角色类Requester.class

/**
 * 发布请求者角色
 */
public class Requester {
private String name;
private int numDay;
public Requester(String name, int numDay) {
    super();
    this.name = name;
    this.numDay = numDay;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getNumDay() {
    return numDay;
}
public void setNumDay(int numDay) {
    this.numDay = numDay;
}

}

Instructor.class

public class Instructor extends RequestHandler{

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

    @Override
    void handleFeeRequest(Requester requester) {
        if (requester.getNumDay()<=3) {
            System.out.println("辅导员"+this.getName()+"批准了"+requester.getName()+"请假"+requester.getNumDay()+"天的请求");
        } else if(this.hander!=null){
            this.hander.handleFeeRequest(requester);
        }
    }

}

President .class

public class President extends RequestHandler{

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

    @Override
    void handleFeeRequest(Requester requester) {
        if (requester.getNumDay()<=7) {
            System.out.println("院长"+this.getName()+"批准了"+requester.getName()+"请假"+requester.getNumDay()+"天的请求");
        } else if(this.hander!=null){
            this.hander.handleFeeRequest(requester);
        }
    }

}

DeanOffice .class

public class DeanOffice extends RequestHandler{

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

    @Override
    void handleFeeRequest(Requester requester) {
        if (requester.getNumDay()<=30) {
            System.out.println("教务处"+this.getName()+"批准了"+requester.getName()+"请假"+requester.getNumDay()+"天的请求");
        } else if(this.hander!=null){
            this.hander.handleFeeRequest(requester);
        }
    }

}

Principal .class

public class Principal extends RequestHandler{

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

    @Override
    void handleFeeRequest(Requester requester) {
        if (requester.getNumDay()<=90) {
            System.out.println("校长"+this.getName()+"批准了"+requester.getName()+"请假"+requester.getNumDay()+"天的请求");
        } else {
            System.out.println(requester.getName()+"你给我滚犊子!明年等着重修吧!");
        }

    }

}

测试代码

RequestHandler instructor = new Instructor("张老师");
RequestHandler president = new President("王老师");
RequestHandler deanOffice = new DeanOffice("李老师");
RequestHandler principal = new Principal("赵老师");
instructor.setHander(president);
president.setHander(deanOffice);
deanOffice.setHander(principal);
Requester requester = new Requester("周小样", 101);
instructor.handleFeeRequest(requester);

运行效果图
这里写图片描述
责任链的优点:
责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道是谁处理,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性
缺点:
一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个比较大的问题;
二是调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂
Android里面最简单的一个责任链模式就是:假如一个Activity里有个RelatieLayout嵌套TextView。一个完整的没有人为干扰的点击事件传递是dispatchTouchEvent(Activity)–>dispatchTouchEvent(RelatieLayout)->onInterceptTouchEvent(RelatieLayout)->dispatchTouchEvent(TextView)->onTouchListener(TextView)->onTouchEvent(TextView)->onTouchEvent(Activity)。
时间不早了,就先介绍到这里吧,关于责任链如果还有什么不清楚的欢迎留言。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值