一、定义
使多个对象都有就会机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连接成一条链,并沿着这条链传递该请求,直到有对象处理他为止。
二、优点
可以将请求与处理分开,请求者不需要直到谁做最后的处理。
三、缺点
责任链过长时,性能较差。
四、故事继续(向谁汇报)
场景1:
“小乔,BOSS在不在?”曹草如一阵风一样的冲到BOSS的办公室里。
“不在,可能在家睡觉吧?”
“不会吧”曹草一脸无奈:“我打电话他也不接!”
“老板在休息时间是绝对不会开手机的,而且他很讨厌手机!”小乔笑道。
“唉,只能等他了........”
场景2:
“小乔,BOSS在不在?”空明笑嘻嘻的走到小乔身边。
“不在,可能在家睡觉吧?”
“哦,那有麻烦了”空明抓了抓头:“看来我要等他了.....”
“看来也只能这样了”小乔笑道。
“唉,BOSS啊....”空明突然话题一转:“小乔,明晚有空吗?《加勒比海盗4》上映了,我们.....”
“不了,我妈叫我早点回家陪她!”小乔赶紧说:“下次吧!”
“.............”
“BOSS也太懒了,总是不在,他们老来烦我,不行,我得找BOSS说道说道....”小乔心说。
一天:BOSS办公室
“老板,最近您经常不在,曹经理和空总监,小黑和紫龙有很多事要找您。”小乔试探的说。
“哦?那结果呢?”李实名看起来心情不错。
“还能怎么样,回去等您了...”
"那不就没事了!"李实名神经大条的说。
“可是,可是不能总是这样啊,那万一事情紧急怎么办?”小乔不满的说。
李实名哈哈大笑:“当然不行,我这几天在家,这个问题已经在梦里....哦不!在思考中解决了!你看我们这样做:”
先定义一个 处理者的抽象类
package zerenlian; public abstract class ChuLi { protected abstract String getJiBie(); protected abstract ChuLi getNextChuLi(); protected abstract void setNextChuLi(ChuLi c); //对请求做出判断 public final void panDuan(QingQiu qingQiu) { if (this.getJiBie().equals(qingQiu.getJiBie())) { this.doIt(qingQiu.getNeiRong()); } else { //级别不对 //是否还有上级 if (this.getNextChuLi() != null) { this.getNextChuLi().panDuan(qingQiu); } else { //没有上级了 } } } //业务处理 protected abstract void doIt(String neiRong); }
然后是具体的处理者
处理者BOSS
package zerenlian; public class BossChuLi extends ChuLi { private String jiBie = "1"; private ChuLi nextChuLi; @Override protected void doIt(String string) { System.out.println(string+"/n批准,给你100万!/n/t/t---李实名"); } @Override protected String getJiBie() { return this.jiBie; } @Override protected ChuLi getNextChuLi() { return this.nextChuLi; } @Override protected void setNextChuLi(ChuLi c) { this.nextChuLi = c; } }
处理者 1
package zerenlian; public class ChuLi1 extends ChuLi { private String jiBie = "3"; private ChuLi nextChuLi; @Override protected void doIt(String string) { System.out.println(string+"/n批准,给你1万!/n/t/t---紫龙"); } @Override protected String getJiBie() { return this.jiBie; } @Override protected ChuLi getNextChuLi() { return this.nextChuLi; } @Override protected void setNextChuLi(ChuLi c) { this.nextChuLi = c; } }
处理者 2
package zerenlian; public class ChuLi2 extends ChuLi { private String jiBie = "2"; private ChuLi nextChuLi; @Override protected void doIt(String string) { System.out.println(string+"/n批准,给你50万!/n/t/t---曹草"); } @Override protected String getJiBie() { return this.jiBie; } @Override protected ChuLi getNextChuLi() { return this.nextChuLi; } @Override protected void setNextChuLi(ChuLi c) { this.nextChuLi = c; } }
接着是请求类
package zerenlian; public class QingQiu { //请求有内容和级别 private String neiRong; private String jiBie; public String getNeiRong() { return neiRong; } public void setNeiRong(String neiRong) { this.neiRong = neiRong; } public String getJiBie() { return jiBie; } public void setJiBie(String jiBie) { this.jiBie = jiBie; } public QingQiu(String neiRong, String jiBie) { super(); this.setJiBie(jiBie); this.setNeiRong(neiRong); } }
最后是 场景
package zerenlian; public class Client { public static void main(String[] args) { ChuLi1 chuLi1 = new ChuLi1(); ChuLi2 chuLi2 = new ChuLi2(); BossChuLi bossChuLi = new BossChuLi(); chuLi1.setNextChuLi(chuLi2); chuLi2.setNextChuLi(bossChuLi); //提出请求1 QingQiu qingQiu = new QingQiu("我想我们需要在上打广告!", "1"); chuLi1.panDuan(qingQiu); //提出请求2 QingQiu qingQiu2 = new QingQiu("我想我们需要给员工组织一场活动.....", "2"); chuLi1.panDuan(qingQiu2); //提出请求3 QingQiu qingQiu3 = new QingQiu("我昨天出去跑业务,受伤了,想工费报销", "3"); chuLi1.panDuan(qingQiu3); } }
结果:
我想我们需要在上打广告!
批准,给你100万!
---李实名
我想我们需要给员工组织一场活动.....
批准,给你50万!
---曹草
我昨天出去跑业务,受伤了,想工费报销
批准,给你1万!
---紫龙
“这样怎么样?”李实名笑笑说道。 “您真是太有才了!” “那是......”有了这套汇报机制,李实名又可以安心的睡觉了,但是他不知道,一场危机正在接近他.........