设计模式:责任链模式

一、前言

   责任链(chain of responsibility)模式很像异常的捕获和处理,当一个问题发生的时候,当前对象看一下自己是否能够处理,不能的话将问题抛给自己的上级去处理,但是要注意这里的上级不一定指的是继承关系的父类,这点和异常的处理是不一样的。所以可以这样说,当问题不能解决的时候,将问题交给另一个对象去处理,就这样一直传递下去直至当前对象找不到下线了,处理结束。如下图所示,处于同等层次的类都继承自Support类,当当前对象不能处理的时候,会根据预先设定好的传递关系将问题交给下一个人,可以说是“近水楼台先得月”,就看有没有能力了。我们也可以看作是大家在玩一个传谜语猜谜底的小游戏,按照座位的次序以及规定的顺序传递,如果一个人能回答的上来游戏就结束,否则继续向下传,如果所有人都回答不出来也会结束。这样或许才是责任链的本质,体现出了同等级的概念。

设计模式:责任链模式

二、代码

 Trouble 类:(数据结构)

 1 package zyr.dp.cor;
 2 
 3 public class Trouble {
 4 
 5     private int number;
 6     public Trouble( int number){
 7         this.number=number;
 8     }
 9     public int getNumber() {
10         return number;
11     }
12     public String toString(){
13         return "问题编号:["+number+"]";
14     }
15 }
Support 类:(抽象类,使用了模板方法)
 1 package zyr.dp.cor;
 2 
 3 public abstract class Support {
 4 
 5     protected abstract boolean resolve(Trouble trouble);
 6     
 7     String name;
 8     Support next;
 9     
10     public Support(String name){
11         this.name=name;
12     }
13     
14     public String toString() {
15         return "对象:<"+name+">";
16     }
17     
18     public Support setAndReturnNext(Support next){
19         this.next=next;
20         return next;
21     }
22     
23     public final void support(Trouble trouble){
24         if(resolve(trouble)){
25             done(trouble);
26         }else if(next!=null){
27             next.support(trouble);
28         }else{
29             fail(trouble);
30         }
31     }
32 
33     protected void fail(Trouble trouble) {
34         System.out.println(this+"解决问题失败,"+trouble);
35     }
36 
37     protected void done(Trouble trouble) {
38         System.out.println(this+"已经解决问题,"+trouble);
39     }
40 
41 }

 NoSupport 类:

 1 package zyr.dp.cor;
 2 
 3 public class NoSupport extends Support {
 4 
 5     public NoSupport(String name) {
 6         super(name);
 7     }
 8 
 9     protected boolean resolve(Trouble trouble) {
10         return false;
11     }
12 
13 }

 OddSupport 类:

 1 package zyr.dp.cor;
 2 
 3 public class OddSupport extends Support {
 4 
 5     public OddSupport(String name) {
 6         super(name);
 7     }
 8 
 9     protected boolean resolve(Trouble trouble) {
10         return (trouble.getNumber()%2) == 1 ? true : false;
11     }
12 
13 }

 SpecialSupport 类:

 1 package zyr.dp.cor;
 2 
 3 public class SpecialSupport extends Support {
 4 
 5     public int specialNumber;
 6     public SpecialSupport(String name,int specialNumber) {
 7         super(name);
 8         this.specialNumber= specialNumber;
 9     }
10 
11     protected boolean resolve(Trouble trouble) {
12         return trouble.getNumber()==specialNumber ? true : false;
13     }
14 
15 }

 LimitSupport 类:

 1 package zyr.dp.cor;
 2 
 3 public class LimitSupport extends Support {
 4 
 5     private int limit;
 6     public LimitSupport(String name,int limit) {
 7         super(name);
 8         this.limit=limit;
 9     }
10 
11     protected boolean resolve(Trouble trouble) {
12         return trouble.getNumber()<=limit? true : false;
13     }
14 
15 }

  Main类:

 1 package zyr.dp.cor;
 2 
 3 public class Main {
 4 
 5     public static void main(String[] args) {
 6         Support limitSupportLess = new LimitSupport("有限支持小",5);
 7         Support limitSupportMore = new LimitSupport("有限支持大",15);
 8         Support oddSupport = new OddSupport("奇数支持");
 9         Support specialSupport = new SpecialSupport("特定支持",36);
10         Support noSupport = new NoSupport("没有支持");
11         limitSupportLess.setAndReturnNext(limitSupportMore).setAndReturnNext(oddSupport).setAndReturnNext(specialSupport).setAndReturnNext(noSupport);
12         System.out.println("===<有限支持小>尝试解决问题===");
13         for(int i=0;i<40;i++){
14             limitSupportLess.support(new Trouble(i));
15         }
16         System.out.println("===<特定支持>尝试解决问题===");
17         for(int i=0;i<40;i++){
18             specialSupport.support(new Trouble(i));
19         }
20 
21     }
22 
23 }

运行结果:

 1 ===<有限支持小>尝试解决问题===
 2 对象:<有限支持小>已经解决问题,问题编号:[0]
 3 对象:<有限支持小>已经解决问题,问题编号:[1]
 4 对象:<有限支持小>已经解决问题,问题编号:[2]
 5 对象:<有限支持小>已经解决问题,问题编号:[3]
 6 对象:<有限支持小>已经解决问题,问题编号:[4]
 7 对象:<有限支持小>已经解决问题,问题编号:[5]
 8 对象:<有限支持大>已经解决问题,问题编号:[6]
 9 对象:<有限支持大>已经解决问题,问题编号:[7]
10 对象:<有限支持大>已经解决问题,问题编号:[8]
11 对象:<有限支持大>已经解决问题,问题编号:[9]
12 对象:<有限支持大>已经解决问题,问题编号:[10]
13 对象:<有限支持大>已经解决问题,问题编号:[11]
14 对象:<有限支持大>已经解决问题,问题编号:[12]
15 对象:<有限支持大>已经解决问题,问题编号:[13]
16 对象:<有限支持大>已经解决问题,问题编号:[14]
17 对象:<有限支持大>已经解决问题,问题编号:[15]
18 对象:<没有支持>解决问题失败,问题编号:[16]
19 对象:<奇数支持>已经解决问题,问题编号:[17]
20 对象:<没有支持>解决问题失败,问题编号:[18]
21 对象:<奇数支持>已经解决问题,问题编号:[19]
22 对象:<没有支持>解决问题失败,问题编号:[20]
23 对象:<奇数支持>已经解决问题,问题编号:[21]
24 对象:<没有支持>解决问题失败,问题编号:[22]
25 对象:<奇数支持>已经解决问题,问题编号:[23]
26 对象:<没有支持>解决问题失败,问题编号:[24]
27 对象:<奇数支持>已经解决问题,问题编号:[25]
28 对象:<没有支持>解决问题失败,问题编号:[26]
29 对象:<奇数支持>已经解决问题,问题编号:[27]
30 对象:<没有支持>解决问题失败,问题编号:[28]
31 对象:<奇数支持>已经解决问题,问题编号:[29]
32 对象:<没有支持>解决问题失败,问题编号:[30]
33 对象:<奇数支持>已经解决问题,问题编号:[31]
34 对象:<没有支持>解决问题失败,问题编号:[32]
35 对象:<奇数支持>已经解决问题,问题编号:[33]
36 对象:<没有支持>解决问题失败,问题编号:[34]
37 对象:<奇数支持>已经解决问题,问题编号:[35]
38 对象:<特定支持>已经解决问题,问题编号:[36]
39 对象:<奇数支持>已经解决问题,问题编号:[37]
40 对象:<没有支持>解决问题失败,问题编号:[38]
41 对象:<奇数支持>已经解决问题,问题编号:[39]
42 ===<特定支持>尝试解决问题===
43 对象:<没有支持>解决问题失败,问题编号:[0]
44 对象:<没有支持>解决问题失败,问题编号:[1]
45 对象:<没有支持>解决问题失败,问题编号:[2]
46 对象:<没有支持>解决问题失败,问题编号:[3]
47 对象:<没有支持>解决问题失败,问题编号:[4]
48 对象:<没有支持>解决问题失败,问题编号:[5]
49 对象:<没有支持>解决问题失败,问题编号:[6]
50 对象:<没有支持>解决问题失败,问题编号:[7]
51 对象:<没有支持>解决问题失败,问题编号:[8]
52 对象:<没有支持>解决问题失败,问题编号:[9]
53 对象:<没有支持>解决问题失败,问题编号:[10]
54 对象:<没有支持>解决问题失败,问题编号:[11]
55 对象:<没有支持>解决问题失败,问题编号:[12]
56 对象:<没有支持>解决问题失败,问题编号:[13]
57 对象:<没有支持>解决问题失败,问题编号:[14]
58 对象:<没有支持>解决问题失败,问题编号:[15]
59 对象:<没有支持>解决问题失败,问题编号:[16]
60 对象:<没有支持>解决问题失败,问题编号:[17]
61 对象:<没有支持>解决问题失败,问题编号:[18]
62 对象:<没有支持>解决问题失败,问题编号:[19]
63 对象:<没有支持>解决问题失败,问题编号:[20]
64 对象:<没有支持>解决问题失败,问题编号:[21]
65 对象:<没有支持>解决问题失败,问题编号:[22]
66 对象:<没有支持>解决问题失败,问题编号:[23]
67 对象:<没有支持>解决问题失败,问题编号:[24]
68 对象:<没有支持>解决问题失败,问题编号:[25]
69 对象:<没有支持>解决问题失败,问题编号:[26]
70 对象:<没有支持>解决问题失败,问题编号:[27]
71 对象:<没有支持>解决问题失败,问题编号:[28]
72 对象:<没有支持>解决问题失败,问题编号:[29]
73 对象:<没有支持>解决问题失败,问题编号:[30]
74 对象:<没有支持>解决问题失败,问题编号:[31]
75 对象:<没有支持>解决问题失败,问题编号:[32]
76 对象:<没有支持>解决问题失败,问题编号:[33]
77 对象:<没有支持>解决问题失败,问题编号:[34]
78 对象:<没有支持>解决问题失败,问题编号:[35]
79 对象:<特定支持>已经解决问题,问题编号:[36]
80 对象:<没有支持>解决问题失败,问题编号:[37]
81 对象:<没有支持>解决问题失败,问题编号:[38]
82 对象:<没有支持>解决问题失败,问题编号:[39]
运行结果

相关文章: