2017-09-22 4 views
0

私は
がチェーンの開始から終了までのチェーンを横断責任デザインパターンのチェーンの単純な実装を持っていますが、今私は
を作りたいですチェーンはある点から始まり、ある点で終わる。チェーン

ここでは、Javaでの単純なパターン実装例を示します。 ここで私はBをチェーンストップにしたいのですが、それを実装する最良の方法は何ですか?

public static void main(String[] args) { 
     PlanetHandler chain = setUpChain(); 
     //Stop in B dont continue to C 
     chain.handleRequest(TypeEnum.B); 

} 


public enum TypeEnum { 
    A, B, C; 
} 

public abstract class Handler { 
    Handler successor; 
    public void setSuccessor(Handler successor) { 
     this.successor = successor; 
    } 
    public abstract void handleRequest(TypeEnum t); 
} 


public class A extends Handler { 

    public void handleRequest(TypeEnum t) {  
      if (successor != null) { 
       successor.handleRequest(request); 
      } 
     } 
    } 
} 

public class B extends Handler { 

    public void handleRequest(TypeEnum t) {  
      if (successor != null) { 
       successor.handleRequest(request); 
      } 
     } 
    } 
} 

public class C extends Handler { 

    public void handleRequest(TypeEnum t) {  
      if (successor != null) { 
       successor.handleRequest(request); 
      } 
     } 
    } 
} 

public static Handler setUpChain() { 
     Handler a = new A(); 
     Handler b = new B(); 
     Handler c = new C(); 
     a.setSuccessor(b); 
     b.setSuccessor(c); 
     return a; 
} 
+0

対応する「TyepEnum」を各クラスに追加し、同じときに停止する条件を追加しますか? – Oleg

答えて

0

この内容はどうですか?

public class Main { 
    public static void main(String[] args) { 
     Handler chain = PlanetHandler.setUpChain(); 
     //Stop in B dont continue to C 
     chain.handleRequest(TypeEnum.B); 
    } 
} 



enum TypeEnum { 
    A, B, C; 
} 

abstract class Handler { 
    Handler successor; 
    public void setSuccessor(Handler successor) { 
     this.successor = successor; 
    } 

    public final void handleRequest(TypeEnum t) { 
     switch(t) { 
     case C: break; 
     default: handle(t); break; 
     } 
    } 

    public abstract void handle(TypeEnum t); 
} 


class A extends Handler { 

    public void handle(TypeEnum t) {  
     if (successor != null) { 
      System.out.println("Handling A"); 
      successor.handleRequest(t); 
     } 
    } 

} 

class B extends Handler { 

    public void handle(TypeEnum t) {  
     if (successor != null) { 
      System.out.println("Handling B"); 
      successor.handleRequest(t); 
     } 
    } 

} 

class C extends Handler { 

    public void handle(TypeEnum t) {  
     if (successor != null) { 
      System.out.println("Handling C"); 
      successor.handleRequest(t); 
     } 
    } 
} 

class PlanetHandler { 

public static Handler setUpChain() { 
    Handler a = new A(); 
    Handler b = new B(); 
    Handler c = new C(); 
    a.setSuccessor(b); 
    b.setSuccessor(c); 
    return a; 
} 

} 

それは基本的には(上記スイッチケースを参照)を取り扱う上での実際の制御を管理している抽象クラスの一般的なハンドルの機能を実現します。

+0

いいえ、その動的ではない、私はそれがFで停止するには何か(私はF以上までチェーンを持っていた場合) – user63898

0

まず、handleRequestから何かを返します。このようにして、リクエストがハンドラによって処理されたかどうかを確認し、そうでない場合は、次のハンドラに渡します。どのようにこのようなものについて:

public abstract class Handler { 

    Handler successor; 

    public void setSuccessor(Handler successor) { 
     this.successor = successor; 
    } 

    public boolean handleRequestInChain(TypeEnum t) { 
     boolean handled = handleRequest(t); 

     if (handled) { 
      return true; 
     } else if (successor != null) { 
      return successor.handleRequestInChain(t); 
     } else { 
      return false; 
     } 
    } 

    public abstract boolean handleRequest(TypeEnum t); 
} 

次にチェーンを構築し、それの頭のhandleRequestInChainにリクエストを渡します。

+0

私はかなり私はBで停止する必要がありますhandleRequest(t)を知っていますか? あなたはchin要素が汎用でなければならず、handleRequestInChain(t)だけがそれを停止させるべきであることがわかります – user63898

+0

handleRequestはわかりません。唯一の目的は、要求を処理してtrueを返すか、それを処理せずfalseを返すことです。これは、ハンドリングが停止するはずの抽象ハンドラであり、handleRequestInChainで行います。 – amorfis