责任链模式
责任链模式就是让多个对象按职责层次依次处理请求,使多个对象都有机会按照职责处理请求。
想进我们实验室也不件容易的事情,需要经过层层面试,最后由老总拍板确认是否录用。以前这套做法工作的很好,因为大家都这么做,但是实验室最近扩张了不少,人事处在大肆招人,老总就忙不过来了。
顾问林阿标就提出了一个改进方案,让人事处员工面试第一轮,并且人事处员工能够决定是否录用薪资在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); } } }
以上就是一个责任链模式的例子。由各个单元组成一个链式结构,单一个单元响应不了请求的时候,就将这个请求传递给链式结构的下一个节点,而且这个节点也只能传递给下一个节点,因为他只持有下一个节点的引用。
这个链式结构和链表的存储方式差不多,每一个节点除了自身的信息外还存储者下一节点的引用。