设计模式笔记之十三 (责任链模式)

责任链模式

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

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

顾问林阿标就提出了一个改进方案,让人事处员工面试第一轮,并且人事处员工能够决定是否录用薪资在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);
        }
    }

}

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

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

 

posted @ 2013-05-23 13:53  biglaojiang  阅读(1321)  评论(3编辑  收藏  举报