zoukankan      html  css  js  c++  java
  • 设计模式——责任链模式

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

    请求在这个链上传递,直到被处理或者是不能处理,返回!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

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

    简单工厂模式

    工厂方法模式

    抽象工厂模式

    建造者模式

    原型模式

    适配器模式

    桥接模式

    装饰模式

    代理模式

    组合模式

    门面模式

    享元模式

    责任链模式

    命令模式

    中介者模式

    备忘录模式

    观察者模式

    状态模式

    策略模式

    模板方法模式

    访问者模式

  • 相关阅读:
    Java流关闭总结
    Too many open files 问题
    oracle数据库表被锁的解锁方法
    中文转换成字节数组
    java接口理解
    最小的K个数
    数组中出现次数超过一半的数字
    复杂链表的复制
    二叉树中和为某一值的路径
    二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6422796.html
Copyright © 2011-2022 走看看