设计模式之责任链模式

来源:互联网 发布:企业进出口数据 编辑:程序博客网 时间:2024/06/05 21:50
刚学习了责任链模式,感觉还是蛮不错的,随手记录了下学习的内容。

责任链模式:责任链模式用于弱化请求发生者和请求处理者之间的关系。当多个对象都可以对请求进行处理,但不同的对象能处理的请求类型不同时,可以通过指向另一个对象的引用把这些对象连成一条责任链。当 Client 发出一个请求时,并不知道具体由哪个对象进行处理,它看到的只是一条责任链,将请求直接交给责任链,请求会在责任链中传递,直到找到一个能够进行处理的对象或者遍历结束找不到一个能够处理的对象为止。Java 语言中的异常处理机制就是责任链模式的一个典型应用例子。

下面模拟的是一个员工处理问题层次的责任链模式,不同级别的员工能处理不同级别的请求。

首先设计一个请求类:
Java代码 复制代码 收藏代码
  1. package com.design.test.mode.responsibilityChain;   
  2.   
  3. /**  
  4.  *  请求操作  
  5.  *  请求分级别,不同的级别需要不同层次的去处理一个请求  
  6.  * @author Share  
  7.  *  
  8.  */  
  9. public class Request {   
  10.     public static final int TYPE_1 = 1;   
  11.     public static final int TYPE_2 = 2;   
  12.     public static final int TYPE_3 = 3;   
  13.     public static final int TYPE_4 = 4;   
  14.        
  15.     private int type;   
  16.     private String msg;   
  17.        
  18.     public Request(int type,String msg){   
  19.         this.type=type;   
  20.         this.msg=msg;   
  21.     }   
  22.        
  23.     public int getType() {   
  24.         return type;   
  25.     }   
  26.   
  27.     public String getMsg() {   
  28.         return msg;   
  29.     }   
  30. }  


设计员工的抽象类:
Java代码 复制代码 收藏代码
  1. package com.design.test.mode.responsibilityChain;   
  2.   
  3. /**  
  4.  *  定义一个员工抽象类  
  5.  *  一个员工有自己的上层,不同上层有处理问题的级别  
  6.  *  如果最上层都处理不了这问题,则无人能处理这问题。  
  7.  *  具体的员工类必须重写processRequest方法,才能见效  
  8.  * @author Share  
  9.  *  
  10.  */  
  11. public abstract class Employee {   
  12.     protected Employee boss;   
  13.     protected String name;   
  14.     protected int requestLevel;   
  15.        
  16.     public Employee(Employee boss,String name){   
  17.         this.boss = boss;   
  18.         this.name = name;   
  19.     }   
  20.        
  21.     public void processRequest(Request request){   
  22.         if(boss!=null){   
  23.             boss.processRequest(request);   
  24.         }else{   
  25.             System.out.println("Nobody can handle the request."+request.getMsg());   
  26.         }   
  27.     }   
  28.        
  29.        
  30. }  


管理员员工类:
Java代码 复制代码 收藏代码
  1. package com.design.test.mode.responsibilityChain;   
  2.   
  3. ublic class Manager extends Employee {   
  4.   
  5. public Manager(Employee boss, String name) {   
  6.     super(boss, name);   
  7.     requestLevel = Request.TYPE_1;   
  8. }   
  9.   
  10. @Override  
  11. public void processRequest(Request request) {   
  12.     if(request.getType() > requestLevel){   
  13.         System.out.println(this.name+" say: I can't handle the request. My boss will handle it.");   
  14.         super.processRequest(request);   
  15.     }else{   
  16.         System.out.println(this.name+" say: I can handle the request."+request.getMsg());   
  17.     }   
  18. }   
  19.   



主管类:
Java代码 复制代码 收藏代码
  1. package com.design.test.mode.responsibilityChain;   
  2.   
  3. public class Director extends Employee {   
  4.   
  5.     public Director(Employee boss, String name) {   
  6.         super(boss, name);   
  7.         requestLevel = Request.TYPE_2;   
  8.     }   
  9.   
  10.     @Override  
  11.     public void processRequest(Request request) {   
  12.         if(request.getType() > requestLevel){   
  13.             System.out.println(this.name+" say: I can't handle the request. My boss will handle it.");   
  14.             super.processRequest(request);   
  15.         }else{   
  16.             System.out.println(this.name+" say: I can handle the request."+request.getMsg());   
  17.         }   
  18.     }   
  19.        
  20. }  


CEO类:
Java代码 复制代码 收藏代码
  1. package com.design.test.mode.responsibilityChain;   
  2.   
  3. public class CEO extends Employee {   
  4.   
  5.     public CEO(Employee boss, String name) {   
  6.         super(boss, name);   
  7.         requestLevel = Request.TYPE_3;   
  8.     }   
  9.   
  10.     @Override  
  11.     public void processRequest(Request request) {   
  12.         if(request.getType() > requestLevel){   
  13.             System.out.println(this.name+" say: I can't handle the request. My boss will handle it.");   
  14.             super.processRequest(request);   
  15.         }else{   
  16.             System.out.println(this.name+" say: I can handle the request."+request.getMsg());   
  17.         }   
  18.     }   
  19.        
  20. }  


测试类:
Java代码 复制代码 收藏代码
  1. package com.design.test.mode.responsibilityChain;   
  2.   
  3. public class Main {   
  4.   
  5.     public static void main(String[] args) {   
  6.         CEO ceo = new CEO(null"Jack Ceo");   
  7.         Director dir = new Director(ceo, "Sello Director");   
  8.         Manager manager = new Manager(dir, "Fewen Mananger");   
  9.            
  10.         Request req1 = new Request(4"我要加薪");   
  11.         Request req2 = new Request(2"我要请假");   
  12.         Request req3 = new Request(1"我要加班");   
  13.            
  14.         System.out.println("处理请求1");   
  15.         manager.processRequest(req1);   
  16.         System.out.println("处理请求2");   
  17.         manager.processRequest(req2);   
  18.         System.out.println("处理请求3");   
  19.         manager.processRequest(req3);   
  20.     }   
  21. }  



打印结果:

处理请求1
Fewen Mananger say: I can't handle the request. My boss will handle it.
Sello Director say: I can't handle the request. My boss will handle it.
Jack Ceo say: I can't handle the request. My boss will handle it.
Nobody can handle the request.我要加薪
处理请求2
Fewen Mananger say: I can't handle the request. My boss will handle it.
Sello Director say: I can handle the request.我要请假
处理请求3
Fewen Mananger say: I can handle the request.我要加班

 

责任链可以使得系统在不影响客户端的前提下动态的安排责任链和分配责任。责任链模式中包含的角色有抽象处理者,具体处理者以及请求的发送者。责任链可以是一条直线,一个环链甚至一个树结构。它使得每一个具体的消息处理者都有可能处理消息。

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 抽象的请求处理者  
  3.  * @author wly  
  4.  *  
  5.  */  
  6. public abstract class Filter {    
  7.        
  8.     abstract String doFilter(String s);   
  9. }  

 

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 具体处理者A  
  3.  * @author wly  
  4.  *  
  5.  */  
  6. public class FilterA extends Filter {   
  7.   
  8.     @Override  
  9.     String doFilter(String s) {   
  10.         s = s.replace('<''(');   
  11.         s = s.replace('>'')');   
  12.         return s;   
  13.     }   
  14. }  

 

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 具体处理者B  
  3.  * @author wly  
  4.  *  
  5.  */  
  6. public class FilterB extends Filter {   
  7.   
  8.     @Override  
  9.     String doFilter(String s) {   
  10.         s = s.replace('#''$');   
  11.         return s;   
  12.     }   
  13. }  

 

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 具体处理者C  
  3.  * @author wly  
  4.  *  
  5.  */  
  6. public class FilterC extends Filter {   
  7.   
  8.     @Override  
  9.     String doFilter(String s) {   
  10.         s = s.replace('W','C');   
  11.         return s;   
  12.     }   
  13. }  

 

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 责任链中的“链"  
  3.  * @author wly  
  4.  *  
  5.  */  
  6. public class FilterChain extends ArrayList<Filter>{      
  7.        
  8.     public void addFilter(Filter filter) {   
  9.         this.add(filter);   
  10.     }   
  11.        
  12.     public String doFilter(String s) {   
  13.         for(Filter filter:this) {   
  14.             s = filter.doFilter(s);   
  15.         }   
  16.         return s;   
  17.     }   
  18. }  

 

Java代码 复制代码 收藏代码
  1. /**  
  2.  * 客户端类  
  3.  * @author wly  
  4.  *  
  5.  */  
  6. public class Test {   
  7.     public static void main(String[] args){   
  8.            
  9.         FilterChain filterChain = new FilterChain();   
  10.         filterChain.addFilter(new FilterA());   
  11.         filterChain.addFilter(new FilterB());   
  12.         filterChain.addFilter(new FilterC());   
  13.            
  14.         System.out.println(filterChain.doFilter("<今天>,W,#"));   
  15.     }   
  16. }  

   输出:(今天),C,$

   其实,上面的代码并不是真正的责任链,因为具体的处理者应该可以选择将请求继续往下传递还是自己直接处理掉。不过,我们可以拿Android中的Touch事件的传递来做例子。当一个view捕获到一个onTouch事件后,就可以通过onTouch的返回智决定是否继续把事件往它的父级view传递。

 

原创粉丝点击