zoukankan      html  css  js  c++  java
  • 设计模式笔记之十三 (责任链模式)

    责任链模式

    责任链模式就是让多个对象按职责层次依次处理请求,使多个对象都有机会按照职责处理请求。

    想进我们实验室也不件容易的事情,需要经过层层面试,最后由老总拍板确认是否录用。以前这套做法工作的很好,因为大家都这么做,但是实验室最近扩张了不少,人事处在大肆招人,老总就忙不过来了。

    顾问林阿标就提出了一个改进方案,让人事处员工面试第一轮,并且人事处员工能够决定是否录用薪资在3000以下的面试者;人事经理面试第二轮,并且能够决定是否录用薪资在6000以下的面试者;老总面试第三轮,并且决定是否录用薪资在6000以上的面试者:

    import java.util.ArrayList;
    
    class Interviewee {
        public int salary;
        public String role;
        public String gender;
        public String name;
    
        public Interviewee(String name, String role, String gender, int salary) {
            this.name = name;
            this.role = role;
            this.gender = gender;
            this.salary = salary;
        }
    }
    abstract class Interviewer {
        Interviewer next;
        abstract public void interview(Interviewee interviewee);
        public void setNext(Interviewer interviewer) {
            next = interviewer;
        }
        public void moveToNext(Interviewee interviewee) {
            if (next != null) {
                next.interview(interviewee);
            }
        }
    }
    
    class RenShiYuanGong extends Interviewer {
        @Override
        public void interview(Interviewee interviewee) {
            if (interviewee.role == "秘书") { //虽然没说,但是秘书肯定是要老总点头才行的
                if (interviewee.gender == "男") { //老总不好这口
                    System.out.println("人事员工说:" + interviewee.name + "不好意思,我们不找男秘书");
                } else {
                    moveToNext(interviewee);
                }
            } else {
                if (interviewee.salary <= 3000) {
                    if (interviewee.gender == "女") {//只要是女的就招,反正养眼也好
                        System.out.println("人事员工说:" + interviewee.name + "你很适合这个岗位,欢迎加入我们");
                    } else {
                        if (interviewee.role == "下水道工人") { //男的只能干体力活的,难道招个高富帅来抢美女资源么
                            System.out.println("人事员工说:" + interviewee.name + "你很适合这个岗位,欢迎加入我们");
                        } else {
                            System.out.println("人事员工说:" + interviewee.name + "回去吧,我们基本不提供岗位给男性");
                        }
                    }
                } else {
                    moveToNext(interviewee);
                }
            }
            
        }
        
    }
    
    class RenShiJingLi extends Interviewer {
        @Override
        public void interview(Interviewee interviewee) {
            if (interviewee.role == "秘书") { //虽然没说,但是秘书肯定是要老总点头才行的
                if (interviewee.gender == "男") { //老总不好这口
                    System.out.println("人事经理说:" + interviewee.name + "不好意思,我们不找男秘书");
                } else {
                    moveToNext(interviewee);
                }
            } else {
                if (interviewee.salary <= 6000) {
                    if (interviewee.gender == "女") {//只要是女的就招,反正养眼也好
                        System.out.println("人事经理说:" + interviewee.name + "你很适合这个岗位,欢迎加入我们");
                    } else {
                        if (interviewee.role == "下水道工人") { //男的只能干体力活的,难道招个高富帅来抢美女资源么
                            System.out.println("人事经理说:" + interviewee.name + "你很适合这个岗位,欢迎加入我们");
                        } else {
                            System.out.println("人事经理说:" + interviewee.name + "回去吧,我们基本不提供岗位给男性");
                        }
                    }
                } else {
                    moveToNext(interviewee);
                }
            }
            
        }
        
    }
    class LaoZong extends Interviewer {
        @Override
        public void interview(Interviewee interviewee) {
            if (interviewee.role == "秘书") {
                System.out.println("老总说:" + interviewee.name + "不好意思,你不是我的菜");
            } else {
                    if (interviewee.gender == "女") {//只要是女的就招,反正养眼也好
                        System.out.println("老总说:" + interviewee.name + "你很适合这个岗位,欢迎加入我们");
                    } else {
                        if (interviewee.role == "下水道工人") { //男的只能干体力活的,难道招个高富帅来抢美女资源么
                            System.out.println("老总说:" + interviewee.name + "你很适合这个岗位,欢迎加入我们");
                        } else {
                            System.out.println("老总说:" + interviewee.name + "回去吧,我们基本不提供岗位给男性");
                        }
                    }
            }
            
        }
        
    }
    
    public class ChainOfResponsibility {
    
        public static void main(String[] args) {
            //设置责任链, 从人事员工 到 人事经理 到 老总
            Interviewer laozong = new LaoZong();
            Interviewer renshiyuangong = new RenShiYuanGong();
            Interviewer renshijingli = new RenShiJingLi();
            renshiyuangong.setNext(renshijingli);
            renshijingli.setNext(laozong);
            
            ArrayList<Interviewee> interviewees = new ArrayList<Interviewee>();
            interviewees.add(new Interviewee("张三", "厂长", "男", 9000));
            interviewees.add(new Interviewee("李四", "下水道工人", "男", 2000));
            interviewees.add(new Interviewee("王五", "部长", "男", 7000));
            interviewees.add(new Interviewee("赵六", "顾问", "女", 5000));
            interviewees.add(new Interviewee("马七", "干事", "男", 6000));
            interviewees.add(new Interviewee("小则元", "干事", "女", 6000));
            interviewees.add(new Interviewee("高树玛丽呀", "秘书", "女", 29999));
            interviewees.add(new Interviewee("加藤音", "秘书", "男", 2999));
            
            for (Interviewee interviewee:interviewees) {
                renshiyuangong.interview(interviewee);
            }
        }
    
    }

    以上就是一个责任链模式的例子。由各个单元组成一个链式结构,单一个单元响应不了请求的时候,就将这个请求传递给链式结构的下一个节点,而且这个节点也只能传递给下一个节点,因为他只持有下一个节点的引用。

    这个链式结构和链表的存储方式差不多,每一个节点除了自身的信息外还存储者下一节点的引用。

  • 相关阅读:
    020-请你说一说app测试的工具
    栈的压入、弹出序列
    包含min函数的栈
    顺时针打印矩阵
    二叉树的镜像
    树的子结构
    链表中倒数第k个结点
    调整数组顺序使奇数位于偶数前面
    数值的整数次方
    矩形覆盖
  • 原文地址:https://www.cnblogs.com/biglaojiang/p/3094766.html
Copyright © 2011-2022 走看看