设计模式——责任链模式

责任链模式是一种行为模式,由许多可以处理同一件事情的对象,组成一个链状结构,每一个对象记录其下一个对象的引用,用于传递请求;

请求在这个链上传递,直到被处理或者是不能处理,返回!tomcat的servlet,Struts的filter都采用了责任链的设计模式。

以领导批复员工请假为例:

项目经理 部门经理 boss都可以批准请假,但处理请假的权限和处理方式可能略有不同;如项目经理只能处理1天以下的请假,部门经理只能处理5天以下的请假... ...

责任链模式一般包含两种角色:

1、处理事情的抽象类(约束了对象需要实现的具体方法及对象需要记录有其下级处理对象)

2、处理事情的具体对象(至少由两个不同类)

下面看具体实现:

首先定义抽象类

/*
 * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
 */

package com.pt.chain;

/**
 * @description 责任角色的抽象类
 * @author panteng
 * @date 17-2-21.
 */
public abstract class Leader {
    public Leader upLeader;     //上级领导

    public Leader getUpLeader(){
        return upLeader;
    }
    public void setUpLeader(Leader upLeader){
        this.upLeader = upLeader;
    }

    //请假处理
    abstract void officialReply(String name, float days, String leaveReason);
}
Leader

定义三个具体的处理类:项目主管 部门主管 Boss

/*
 * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
 */

package com.pt.chain;

/**
 * @description 项目经理
 * @author panteng
 * @date 17-2-21.
 */
public class ProjectLeader extends Leader {

    /**
     * 小于1天 直接批准,大于1天,交由上级领导批准
     * @param name
     * @param days
     * @param leaveReason
     */
    @Override
    void officialReply(String name, float days, String leaveReason){
        if (days <= 1) {
            System.out.println("批准 " + name + "请假");
        } else {
            if (this.getUpLeader() != null) {
                this.getUpLeader().officialReply(name, days, leaveReason);
            } else {
                System.out.println("ProjectLeader的领导不在 无法处理");
            }
        }
    }
}
ProjectLeader
/*
 * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
 */

package com.pt.chain;

/**
 * @description 部门领导
 * @author panteng
 * @date 17-2-21.
 */
public class DevLeader extends Leader {

    /**
     * 小于5天,自己处理;如果是带薪或者必须,批准 否则不批准
     * 大于5天,交由上级领导处理
     * @param name
     * @param days
     * @param leaveReason
     */
    @Override
    void officialReply(String name, float days, String leaveReason){
        if (days <= 5) {
            if ("法定带薪假".equals(leaveReason) || "必须".equals(leaveReason)) {
                System.out.println("批准 " + name + "请假");
            } else {
                System.out.println("不批准 " + name + "请假");
            }
        } else {
            if (this.getUpLeader() != null) {
                this.getUpLeader().officialReply(name, days, leaveReason);
            } else {
                System.out.println("DevLeader的领导不在 无法处理");
            }
        }
    }
}
DevLeader
/*
 * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
 */

package com.pt.chain;

/**
 * @description
 * @author panteng
 * @date 17-2-21.
 */
public class BossLeader extends Leader {
    /**
     * 小于5天 直接批准,大于5天必须是法定或者必须型假期才批准
     * @param name
     * @param days
     * @param leaveReason
     */
    @Override
    void officialReply(String name, float days, String leaveReason){
        if (days < 5) {
            System.out.println("批准 " + name + "请假");
            return;
        }
        if ("法定带薪假".equals(leaveReason) || "必须".equals(leaveReason)) {
            System.out.println("批准 " + name + "请假");
            return;
        }
        System.out.println("不批准 " + name + "请假");
    }
}
BossLeader

测试:

/*
 * Copyright (c) 2017. Xiaomi.Co.Ltd All rights reserved
 */

package com.pt.chain;

import org.junit.Test;

/**
 * @description
 * @author panteng
 * @date 17-2-21.
 */
public class ResponsibilityChainTest {
    @Test
    public void responsibilityChainTest(){
        ProjectLeader projectLeader = new ProjectLeader();
        DevLeader devLeader = new DevLeader();
        BossLeader bossLeader = new BossLeader();

        projectLeader.setUpLeader(devLeader);
        devLeader.setUpLeader(bossLeader);

        projectLeader.officialReply("张三", 1, "身体不适");
        projectLeader.officialReply("李四", 3, "回家");
        projectLeader.officialReply("王五", 7, "法定带薪假");
        projectLeader.officialReply("李四", 3, "必须");

    }
}
ResponsibilityChainTest

 

 

===========================设计模式系列文章=========================

简单工厂模式

工厂方法模式

抽象工厂模式

建造者模式

原型模式

适配器模式

桥接模式

装饰模式

代理模式

组合模式

门面模式

享元模式

责任链模式

命令模式

中介者模式

备忘录模式

观察者模式

状态模式

策略模式

模板方法模式

访问者模式

posted @ 2017-02-21 10:19  沙中世界  阅读(204)  评论(0编辑  收藏  举报