TOP

责任链模式小试(一)
2019-09-03 03:33:56 】 浏览:53
Tags:责任 模式 小试

  责任链模式是一种非常容易理解、容易使用的模式。

  转载请注明出处:http://www.cnblogs.com/zrtqsk/p/3812454.html,谢谢!

 

一、介绍

  我们先来看一下《研磨设计模式》对责任链模式的定义——使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

  责任链模式的本质是——分离职责,动态组合。

  责任链模式是用来解决什么问题的呢?当我们有多个对象可以处理同一请求,但是具体由哪个对象来处理请求是运行时动态确定的,这时候使用责任链模式。责任链模式的核心是一个Handler请求抽象类,它持有一个指向下一个请求的引用。当它满足某个条件的时候,由自己来处理,否则,让下一个请求来处理。说白了就是一个处理器持有另一个处理器的引用,如果自己不能处理,就让另一个处理器处理。我们可以看到,本质上而言,责任链模式更策略模式是很像的,也是实现了方法的复用,不过它多了后续的处理方案。

 

 

二、结构

Handler  :  定义职责的接口,用来定义判断、处理请求的方法handlerRequest(),同时有一个指向下一个处理者的引用successor。

ConcreteHandler  :  实现职责的类。实现在它职权范围内的请求的处理。若不处理,则转发给后继的处理者。

Client  :  调用职责接口,像Handler提交请求。

 

三、我的实现

  假设学生需要请假,如果三天假以内,由辅导员处理,如果超过3天假,需要由学院院长处理,如果超过7天假,需要由学校校长处理。但是学生并不知道自己请假需要谁处理,只知道去找辅导员。面对这种情况,怎么实现呢?

1、首先我们要有一个请求类,作为请求的父类,封装请求的通用属性。如下:

package chain_of_responsibility.me;

public class Request {

    private String type; // 类型

    private String name;    //请求者姓名

    private String description; // 描述

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Request(String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

 

 2、请假请求继承了它,如下:

package chain_of_responsibility.me;

/*
 * 请假请求
 */
public class RequestLeave extends Request {

    public static final String LEAVE_TYPE = "ask_for_leave";

    private int days;

    public RequestLeave() {
        super(LEAVE_TYPE);
    }

    public int getDays() {
        return days;
    }

    public void setDays(int datys) {
        this.days = datys;
    }

}

 

 3、然后,就是我们重点的处理器抽象类,用来处理请求,如下:

package chain_of_responsibility.me;

public abstract class Handler {

    protected Handler successor;

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

    protected abstract String handlerRequst(Request request);

}

4、接下来就是处理器的实现类,3个处理器——辅导员、院长、校长,如下:

package chain_of_responsibility.me;

/*
 * 辅导员
 */
public class HandlerCounsellor extends Handler {

    @Override
    protected String handlerRequst(Request request) {

        if (request.getType().equals(RequestLeave.LEAVE_TYPE)) { // 如果是请假的请求,才处理

            return handlerLeaveRequest(request);

        }else {

            return "辅导员无法受理此请求!";

        }
    }

    private String handlerLeaveRequest(Request request) {

        String returnStr = "";

        RequestLeave rl = (RequestLeave) request;

        if (rl.getDays() <= 3) { // 一旦在3天以内,全部同意

            returnStr = "辅导员同意了" + rl.getName() + "的请假!";

        } else {

            if (successor != null) {

                returnStr = successor.handlerRequst(request);

            } else {

                returnStr = "上级领导不在,暂时无法处理!";

            }
        }

        return returnStr;

    }
}

 

package chain_of_responsibility.me;

/*
 * 院长
 */
public class HandlerDean extends Handler {

    @Override
    protected String handlerRequst(Request request) {

        if (request.getType().equals(RequestLeave.LEAVE_TYPE)) { // 如果是请假的请求,才处理

            return handlerLeaveRequest(request);

        }else {

            return "院长无法受理此请求!";

        }
    }

    private String handlerLeaveRequest(Re  
		
责任链模式小试(一) https://www.cppentry.com/bencandy.php?fid=97&id=249239

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇说说设计模式~组合模式(Composite) 下一篇UML基本关系

kafka-
kafka   Partit
解决android studio
Kafka史上最详细原理
Error while fetchin
【Kafka】安装与快速
    &
flume读取日志数据写
Authentication plug
Flume 自定义source
flume   三大核
ICC副本>>>
愚公移山  
Hbase架构   Hb
5 hbase-shell + &
Hbase   MapRed
MetaException(messa
Exception in thread
HIVE metastore Dupl
-->