1.描述
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
2.模式的使用
·处理者(Handler):处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继对象的方法。
·具体处理者(ConcreteHandler):具体处理者是实现处理者接口的类的实例。具体处理者通过调用处理者接口规定的方法处理用户的请求,即在接到用户的请求后,处理者调用接口规定的方法,在执行该方法的过程中,如果发现能处理用户的请求,就处理有关数据,否则就返回无法处理的信息,然后将请求传递给后继对象。
3.使用情景
·有许多对象可以处理用户的请求,希望程序运行期间自动确定处理请求的对象
·希望用户不明确指定接受者的情况下,向多个接受者的一个提交请求。
·程序希望动态制定可处理用户请求的对象集合。
4.优点
·责任链中的对象只和自己的后继对象是低耦合关系,和其他对象毫无联系。
·当在处理者中分配职责时,责任链给程序更多的灵活性。
·应用程序可以动态地增加、删除处理者或重新指派处理者的职责。
·应用程序可以动态地改变处理者之间的先后顺序。
·使用责任链的用户不必知道处理者的信息,用户不会知道那个对象处理了请求。
5.UML图
6.案例
设计三个类,分别实现使用int型数据计算阶乘、使用long型数据计算阶乘、使用BigInteger型数据计算阶乘。将上述类组成一个责任链,执行顺序:int,long,BigInteger,用户可以请求责任链计算一个整数的阶乘。
1 package 责任链模式; 2 3 import java.math.BigInteger; 4 5 public class test1 { 6 public static void main(String[] args) { 7 Handler useInt = new UseInt(); 8 Handler useLong = new UseLong(); 9 Handler useBigInteger = new UseBigInteger(); 10 useInt.setNextHandler(useLong); 11 useLong.setNextHandler(useBigInteger); 12 useInt.handle("123"); 13 } 14 15 } 16 17 /* 18 * 处理者 19 */ 20 interface Handler{ 21 public abstract void handle(String number); 22 public abstract void setNextHandler(Handler handler); 23 } 24 25 /* 26 * 具体处理者 27 */ 28 class UseInt implements Handler{ 29 private Handler handler; 30 private int result = 1; 31 public void handle(String number) { 32 try{ 33 int n = Integer.parseInt(number); 34 int i =1; 35 while(i <= n){ 36 result *= i; 37 if(result <= 0){ 38 System.out.println("整型计算,超出计算能力"); 39 handler.handle(number); 40 return; 41 } 42 i++; 43 } 44 System.out.println(number + "的阶乘=" + result); 45 }catch(Exception e){ 46 e.printStackTrace(); 47 } 48 } 49 50 public void setNextHandler(Handler handler) { 51 this.handler = handler; 52 } 53 } 54 55 /* 56 * 具体处理者 57 */ 58 class UseLong implements Handler{ 59 private Handler handler; 60 private long result = 1; 61 public void handle(String number) { 62 try{ 63 int n = Integer.parseInt(number); 64 int i =1; 65 while(i <= n){ 66 result *= i; 67 if(result <= 0){ 68 System.out.println("长整型计算,超出计算能力"); 69 handler.handle(number); 70 return; 71 } 72 i++; 73 } 74 System.out.println(number + "的阶乘=" + result); 75 }catch(Exception e){ 76 e.printStackTrace(); 77 } 78 } 79 80 public void setNextHandler(Handler handler) { 81 this.handler = handler; 82 } 83 84 } 85 86 /* 87 * 具体处理者 88 */ 89 class UseBigInteger implements Handler{ 90 private Handler handler; 91 private BigInteger result = new BigInteger("1"); 92 public void handle(String number) { 93 try{ 94 BigInteger n = new BigInteger(number); 95 BigInteger ONE = new BigInteger("1"); 96 BigInteger i = ONE; 97 while(i.compareTo(n) <= 0){ 98 result = result.multiply(i); 99 i = i.add(ONE); 100 } 101 System.out.println(number + "的阶乘=" + result); 102 }catch(Exception e){ 103 e.printStackTrace(); 104 } 105 } 106 107 public void setNextHandler(Handler handler) { 108 this.handler = handler; 109 } 110 111 }