设计模式实例学习-责任链模式

设计模式实例学习-责任链模式

原创博客,转载请注明出处:
http://blog.csdn.net/u011035622/article/details/49853515


定义

概念定义:

(行为模式)

    使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连接成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
    我自己的理解定义:多个处理器对象之间权利存在上下级关系,当提交事件给处理器进行处理时,会交给最底下等级的处理器,它会根据事件的等级决定处理器是否有权利处理,没有的话就将事件提交到上一级的处理器,直到有人处理消费掉该事件。

角色职责

  • 抽象处理器基类
  • 具体处理器类

       如上定义所描述,会有多个处理器,不同处理器的处理权利不同或者说是能力不同,事件会提交给处理器后,处理器对事件等级进行判断,不能处理的事件会提交给上一级的处理器,直到找到能够处理该事件的处理器直接将事件消费。
    
  • 事件提交者接口
  • 具体事件提交者

       事件会有不同的等级,提交给处理器时处理器依据等级判断处理。
    

实例分析

场景描述

  有三个请求事件,分别是请求参加班级春游,申请请假,申请奖学金。提交申请给班长,班长的上级是辅导员,辅导员的上级是校长。同学们只需将事件提交给班长,班长根据自己的能力处理,没有权利处理的请求就提交给辅导员,辅导员也是如此,辅导员无法处理的就提交给校长。

代码实现及讲解

  • 抽象处理器基类 Handler.java

    public abstract class Handler {
    public final static int MONITOR_REQUEST = 1;
    public final static int INSTRUCTOR_REQUEST = 2;
    public final static int PRINCIPAL_REQUEST = 3;
    
    private int level = 0;//等级
    private Handler parentHandler;//比自己高一级的Handler
    
    public Handler(int level) {
        this.level = level;
    }
    
    public final void HandleMessage(ISomethingReq request){
        if(request.getRequestLevel() == this.level){
            this.response(request);
        }else {
            if(null != parentHandler){
                System.out.println("决定不了,上报给我的上级");
                parentHandler.HandleMessage(request);
            }else {
                System.out.println("已到顶级,无人能处理。");
            }
        }
    }
    //设置父处理器
    public void setParentHandler(Handler parentHandler){
        this.parentHandler = parentHandler;
    }
    protected abstract void response(ISomethingReq request);
    }
    • [x] 构造方法:定义自己的等级。
    • [x] HandleMessage:对事件进行处理
    • [x] setParentHandler:设置自己的上级处理器
    • [x] response:抽象的处理方法由具体类去实现

-

  • 具体处理器类

MonitorHandler.java 班长处理器

public class MonitorHandler extends Handler {

    public MonitorHandler() {
        super(MONITOR_REQUEST);
    }

    @Override
    protected void response(ISomethingReq request) {
        System.out.println(request.getRequest() + "\n班长表示同意。");
    }
}

InstructorHandler.java 辅导员处理器

public class InstructorHandler extends Handler{

    public InstructorHandler() {
        super(INSTRUCTOR_REQUEST);
    }

    @Override
    protected void response(ISomethingReq request) {
        System.out.println(request.getRequest() + "\n辅导员表示同意。");
    }
}

PrincipalHandler.java 校长处理器

public class PrincipalHandler extends Handler{

    public PrincipalHandler() {
        super(PRINCIPAL_REQUEST);
    }

    @Override
    protected void response(ISomethingReq request) {
        System.out.println(request.getRequest() + "\n校长表示同意。");
    }
}
  • 事件提交接口 ISomethingReq.java
public interface ISomethingReq {
    int getRequestLevel();
    String getRequest();
}
  • [x] getRequestLevel:获取事件请求的等级
  • [x] getRequest:获取请求内容

  • 具体事件提交接口 SomethingReq.java

public class SomethingReq implements ISomethingReq{
    //定义请求的等级
    private int level = 0;

    private String request = "";

    public SomethingReq(int level, String request) {
        this.level = level;
        this.request = request;
    }

    @Override
    public int getRequestLevel() {
        return level;
    }

    @Override
    public String getRequest() {
        return this.request;
    }

}
  • [x] 构造方法中定义请求等级及请求内容。
  • [x] 实现接口中的两个方法,说明参考接口类。

  • 场景类

package chainOfResponsibility;

public class Main {
    public static void main(String[] args) {
        MonitorHandler mHandler = new MonitorHandler();//班长
        InstructorHandler iHandler = new InstructorHandler();//辅导员
        PrincipalHandler pHandler = new PrincipalHandler();//校长
        //建立父级关系
        mHandler.setParentHandler(iHandler);
        iHandler.setParentHandler(pHandler);
        //实例化事件
        SomethingReq CYReq = new SomethingReq(1, "我想参加班级春游。");
        SomethingReq QJReq = new SomethingReq(2, "我要请假一天不上课。");
        SomethingReq JXJReq = new SomethingReq(3, "我要申请国家励志奖学金。");
        //将事件提交给班长进行处理
        mHandler.HandleMessage(CYReq);
        System.out.println("---------------------");
        mHandler.HandleMessage(QJReq);
        System.out.println("---------------------");
        mHandler.HandleMessage(JXJReq);
    }
}

输出:

我想参加班级春游。
班长表示同意。
---------------------
决定不了,上报给我的上级
我要请假一天不上课。
辅导员表示同意。
---------------------
决定不了,上报给我的上级
决定不了,上报给我的上级
我要申请国家励志奖学金。
校长表示同意。

  第一个事件班级春游,因为参加班级春游是班长可以决定的,班长直接将事件消费,不用提交到父级处理器。
  第二个事件请假,班长不能审批,需要辅导员的审批才能通过,因此提交到辅导员处理器消费事件。
  第三个事件奖学金申请,提交事件给班长,班长接受事件后没有权利处理,提交给班长的父级,即辅导员,辅导员也没办法处理,继续提交给辅导员的父级,即校长,校长能够审核,因此在校长处理器中将事件消费了。


责任链模式的优缺点

优点

  将事件请求和处理分开,请求者不需要知道谁是处理器,不需要了解处理器的内部实现。两者解耦,提高了系统的灵活性。

缺点

  因为处理器传递时需要一级一级的往上传递事件,当处理器等级比较多时可能导致事件传递上耗时,引起性能问题(但一般比较少),具体情况具体分析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值