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 O O第十一天
    mac下安装伪分布hadoop2.6.0和hbase1.0.1.1
    Ubuntu下使用openssl为apache2配置ssl
    ubuntu下安装hadoop
    ubuntu 添加应用到Dash启动器
    Ubuntu12.04中安装Oracle JDK和NetBeans的方法
    Ubuntu12.04中在桌面建立指向网页的链接文件的方法
    Ubuntu12.04中Gvim无法固定到启动器的解决办法
    Ubuntu中apt-get安装或更新软件错误的解决办法
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6422796.html
Copyright © 2011-2022 走看看