比武时,你用拳,我也用拳,你用剑,我也用剑;你用枪,我也用枪。那么这个例子,如下代码:
package pattern;
abstract class Handler{
   String name;
   Handler next;
   
   boolean judgeWeapon(String name){
      if(this.name.equals(name))
          return true;
      return false;
   }
}
class HandlerFist extends Handler{
   public HandlerFist(){
      name = "拳头";
   }
}
class HandlerSword extends Handler{
   public HandlerSword(){
      name = "剑";
   }
}
class HanderGun extends Handler{
   public HanderGun(){
      name = "枪";
   }
}
class Sender{
   private String name;
   public Sender(String name){
      this.name = name;
   }
   public String getName(){
      return name;
   }
}public class Responsibility {
   public static void main(String[] args) {
      Sender sender = new Sender("剑");
      
   }
    
}大家帮我完善一下。

解决方案 »

  1.   

     boolean judgeWeapon(String otherName){
          if(this.name.equals(otherName))
              return true;
          if(next!=null)
              return next.judgeWeapon(otherName);//Call next hadler
          return false;
     }
      

  2.   

    for examplepublic class Responsibility {
       public static void main(String[] args) {
          Sender sender = new Sender("剑");
          Handler h = new HandlerFist();
          h.next = new HandlerSword();
          h.next.next = new HanderGun();
          Responsibility r = new Responsibility(h);
          System.out.println(r.response(sender));
       }
       
        Handler handler;
        public Responsibility(Handler handler) {
            this.handler = handler;
        }    public String response(Sender sender) {
            Handler h = handler;
            while (h != null) {
                if (h.judgeWeapon(sender.getName())) {
                    return h.name; //h.getName() is better
                }
                h = h.next;
            }
            return "no such warpon";
        }
    }
      

  3.   

    楼上两家分成两段,除了Sender之外,事实上Handler与HandlerXXX  都需要修改吧。
      

  4.   

    filter就是个典型的职责连嘛,给你来个类似版吧package pattern;
    abstract class Handler{
    String name;
    void judgeWeapon(HandlerChain chain, name){
           if (this.name.equals(name)) {
    //TODO
    } else {
    //TODO
    }
    //继续执行责任链
    chain.handler(name);
       }
    }
    class HandlerFist extends Handler{
    public HandlerFist(){
    name = "拳头";
    }
    }
    class HandlerSword extends Handler{
    public HandlerSword(){
    name = "剑";
    }
    }
    class HanderGun extends Handler{
    public HanderGun(){
    name = "枪";
    }
    }
    class HandlerChain {
    private int currentHandlerIndex = -1;
    private List<Handler> handlers = new ArrayList<Handler>();
    void addHandler(Handler handler) {
    handlers.add(handler);
    }
    void handler(String name) {
    if (currentHandlerIndex < handlers.size() - 1) {
    handlers.get(++currentHandlerIndex).judgeWeapon(this, name);
    }
    }
    }public class Responsibility {
    public static void main(String[] args) {
    HandlerChain chain = new HandlerChain();
    chain.addHandler(new HandlerFist());
    chain.addHandler(new HandlerSword());
    chain.addHandler(new HanderGun());
    chain.handler("剑");
    }
        
    }
      

  5.   

    在楼主源代码上改了改的abstract class Handler {
      String name;
      Handler next;
      public void addNext(Handler n) {
        next = n;
      }  boolean judgeWeapon(String name) {
        if (this.name.equals(name)) {
          System.out.println("I use :" + this.name);
          return true;
        }
        //传给后面个,如果后面还有任务处理者的话
        if (next != null) {
          return next.judgeWeapon(name);
        } else {
          System.out.println("Enemy is monster...");
          return false;
        }
      }
    }class HandlerFist extends Handler {
      public HandlerFist() {
        name = "拳头";
      }
    }class HandlerSword extends Handler {
      public HandlerSword() {
        name = "剑";
      }
    }class HanderGun extends Handler {
      public HanderGun() {
        name = "枪";
      }
    }class Sender {
      private String name;
      public Sender(String name) {
        this.name = name;
      }  public String getName() {
        return name;
      }
    }class Responsibility {
      public static void main(String[] args) {
        Sender sender = new Sender("剑");
        //按自己的顺序组装任务链
        HanderGun hg = new HanderGun();
        HandlerSword hs = new HandlerSword();
        HandlerFist hf = new HandlerFist();
        hf.addNext(hs);
        hs.addNext(hg);
        //从责任链头部开始处理任务
        hf.judgeWeapon(sender.getName());
      }
    }
      

  6.   

     HanderGun hg = new HanderGun();
        HandlerSword hs = new HandlerSword();
        HandlerFist hf = new HandlerFist();
        hf.addNext(hs);
        hs.addNext(hg);这个代码不是责任链
    责任链是在内部实现链接的,UML说明图中来的。
      

  7.   

    那就做成这样?abstract class Handler {
      String name;
      Handler next;  public Handler(Handler n) {
        next = n;
      }
    ...
    }class HandlerFist extends Handler {
      public HandlerFist(Handler n) {
        super(n);
        name = "拳头";
      }
    }.........class Responsibility {
      public static void main(String[] args) {
        Sender sender = new Sender("剑");
        //按自己的顺序组装任务链
        Handler hg = new HanderGun(null);
        Handler hs = new HandlerSword(hg);
        Handler hf = new HandlerFist(hs);
        //从责任链头部开始处理任务
        hf.judgeWeapon(sender.getName());
      }
    }