责任链模式

来源:互联网 发布:如何做好淘宝客 编辑:程序博客网 时间:2024/05/25 19:58

责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。

 

责任链模式由两个角色组成:
1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。

 

public abstract class Handler{

    protected Handler successor;

    protected String name;

    public String getName(){

         return name;

    }

     //处理请求,由子类完成

     public abstract void handleRequest(String request);

     //设置下一个处理请求的人

     public void setNextHandle(Handler successor){

         this.successor = successor;

      }

 

}

 

public LaoShi extends Handler{

    public LaoShi(String name){

        this.name = name;

    }

    public void handleRequest(String request){

         if("请假不去上课".equals(request)){

              System.out.println(name+"可以处理"+request+",给与批准");

          }else{

              System.out.println(name+"不可以处理"+request+"转交给"+successor.getName());

              successor.handleRequest(request);

          }

    }

}

public class BanZhang extends Handler {  

    public BanZhang(String name) {  

       this.name = name;  

    }  

    public void handleRequest(String request) {  

     if ("不去开班会".equals(request)) {  

            System.out.println(name + "可以处理" + request + ",给予批准!");  

        } else {  

            System.out.println(name + "不可以处理" + request + "转交给"  

                    + successor.getName());  

            successor.handleRequest(request);  

        }  

    }  

}  

 

 

  • public class DaoYuan extends Handler {  
  •     public DaoYuan(String name) {  
  •         this.name = name;  
  •     }  
  •   
  •     public void handleRequest(String request) {  
  •         if ("离校".equals(request)) {  
  •             System.out.println(name + "可以处理" + request + "给于批准!");  
  •         } else {  
  •             System.out.println(name + "不可以处理" + request + "转交给"  
  •                     + successor.getName());  
  •             successor.handleRequest(request);  
  •         }  
  •     }  
  • }  
  •   
  • public class XiaoZhang extends Handler {  
  •     public XiaoZhang(String name) {  
  •         this.name = name;  
  •     }  
  •   
  •     public void handleRequest(String request) {  
  •         if ("退学".equals(request)) {  
  •             System.out.println(name + "可以处理" + request + "给于批准!");  
  •         } else {  
  •             System.out.println(name + "觉的" + request + "是无理请求,不给于批准");  
  •         }  
  •     }  
  • }  
  • public class XueYuanWithPattern {  
  •     private String name;  
  •   
  •     public XueYuanWithPattern(String name) {  
  •         this.name = name;  
  •     }  
  •   
  •     public static void main(String[] args) {  
  •         Handler banzhang = new BanZhang("班长");  
  •         Handler laoshi = new BanZhang("老师");  
  •         Handler daoyuan = new DaoYuan("导员");  
  •         Handler xiaozhang = new XiaoZhang("校长");  
  •         banzhang.setNextHandler(laoshi); // 设置班长的下一个处理者是老师  
  •         laoshi.setNextHandler(daoyuan);// 设置老师的下一个处理者是导员  
  •         daoyuan.setNextHandler(xiaozhang);// 设置导员的下一个处理者是校长  
  •         String requests = "退学";  
  •         // 把请求交给班长即可,如果班长处理不了会一层层往上交  
  •         banzhang.handleRequest(requests);  
  •     }  
  • }  
  •  

     

    责任链模式优点,上面已经体现出来了。无非就是降低了耦合、提高了灵活性。但是责任链模式可能会带来一些额外的性能损耗,因为它要从链子开头开始遍历。
    因为无法预知来自外界(客户端)的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。
    缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR
    扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里。