2017-09-22 4 views
0

J'ai mise en œuvre simple chaîne de modèle de conception de la responsabilité qui
traversant la chaîne du début à la fin de la chaîne, mais maintenant je veux faire
la chaîne commence à partir d'un certain point et se termine à un certain point.chaîne de mise en œuvre du modèle de conception de la responsabilité de commencer l'arrêt de la chaîne en différents points

Par exemple, voici une implémentation de modèle simple dans JAVA, ici je veux l'arrêt de la chaîne en B, quelle est la meilleure façon de l'implémenter?

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

Ajouter le 'TyepEnum 'correspondant à chaque classe et Ajouter une condition qui va s'arrêter quand ils sont identiques? – Oleg

Répondre

0

Que pensez-vous de cela?

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; 
} 

} 

Il implémente essentiellement une fonction de poignée générale dans la classe abstraite où il est géré le contrôle effectif de la manutention (voir au-dessus du boîtier de commutation).

+0

non ce n'est pas dynamique, un peu de temps je l'arrête en F (si j'avais chaîne jusqu'à F ou plus) – user63898

0

Tout d'abord, retourner quelque chose de handleRequest. De cette façon, vous pouvez vérifier si la demande a été traitée par le gestionnaire ou non, et si ce n'est pas le cas, passez-la au gestionnaire suivant. Que diriez-vous quelque chose comme ceci:

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); 
} 

THEN la chaîne, et transmettre la demande à sa tête de handleRequestInChain.

+0

Je ne comprends pas très bien comment handleRequest (t) sait que je dois arrêter dans B? vous voyez que l'élément chin doit être générique et seul handleRequestInChain (t) doit le faire arrêter – user63898

+0

handleRequest ne sait pas. Son seul but est de gérer la requête et de renvoyer true, ou de ne pas la gérer et de renvoyer false. C'est le gestionnaire abstrait qui décide que la gestion devrait s'arrêter, et il le fait dans handleRequestInChain – amorfis