java: comment définir les capacités d'une instance de la sous-classe qui peut être dérivé de la superclasse

StackOverflow https://stackoverflow.com/questions/5822358

  •  26-10-2019
  •  | 
  •  

Question

Pour ma question plus concrète, laissez-moi pose comme un problème:

Description de la situation:

Nous avons 3 concepts abstraits:

Boss:  which has a number of employees
Worker:  that can execute some types of tasks
Task:  contains the semantics needed for a worker to execute it

Dans la mise en œuvre / sous-types, nous avons un certain nombre de différents types de travailleurs et différents types de tâches. Un type spécifique de travailleur peut exécuter certains types de tâches (sous-ensemble de tous les types)

problème à résoudre

Maintenant, le patron a une tâche de type connu qu'il souhaite voir exécuter, il ne connaît pas les types de travailleurs qu'il a (seul type / interface abstraite). Quel type d'interface (s) pourrait mettre en œuvre le travailleur / ce que le patron pourrait faire pour savoir?

façons de résoudre ce que je peux penser à

J'ai trouvé cela de deux façons, mais il y a probablement d'autres et de meilleures façons:

1) nous faisons une classe pour chaque type de tâche qui implémente l'interface de tâche vide donner au travailleur une fonction d'exécution (tâche): dans la mise en œuvre de l'exécution (tâche) essayer de typer / tâche à tous les acteurs tasktypes ce type de travailleur peut effectuer. Si aucun des typable passe, on jette un taskNotSupportedException. le patron peut maintenant donner des tâches aux travailleurs jusqu'à ce qu'aucune exception est levée.

2) nous n'avons pas maintenant des cours de travail, mais définir une interface de capacité pour chaque type de tâche avec la fonction dotaskType (de TaskInfo) une mise en œuvre des travailleurs peut désormais mettre en œuvre des interfaces de capacité dépendantes de ce que ses capacités sont. le patron peut maintenant vérifier jusqu'à ce que se trouve un travailleur ayant la capacité appropriée (typage) puis lui donner la tâche en sachant qu'il peut exécuter.

Je n'ai pas testé 2 et je n'ai pas beaucoup d'expérience en Java, mais cela devrait être possible (ou quelque chose de très similaire).

Je préfère aussi 2 sur 1, car 1 semble inapproprié (cascade de moulages) et les interfaces sont un moyen naturel de définir ce qu'est une instance d'une classe peut faire, aussi avec des interfaces, vous pouvez les capacités de groupe / créer des hiérarchies. (Aussi dans ma mise en œuvre en cours (1) l'interface des tâches est vide, si les tâches ne sont pas beaucoup en commun et les informations sont transmises par le constructeur (ce qui serait paramètres de fonctions dans la méthode 2) et récupérés par obtient.

Je me demandais dans quelle autre façon vous / pourriez mettre en œuvre (réglage 1 ou 2?) Ce ou qui des deux que vous préférez et pourquoi. (Efficacité n'a pas d'importance, la modulation / abstraction / maintenabilité est!)

Était-ce utile?

La solution

Ne pas utiliser des exceptions. Les exceptions doivent être utilisées pour des situations exceptionnelles, et ne pas être en mesure d'effectuer une tâche semble être normal.

Je voudrais ajouter une méthode

boolean isAbleToExecute(Task task)

dans la classe des travailleurs, et ont le patron itérer par ses travailleurs et trouver un travailleur en mesure d'exécuter la tâche avant de l'assigner.

Autres conseils

L'interface travailleur pourrait inclure une méthode supportedTasks retour une liste de tâches. Ensuite, vous pouvez maintenir une carte, la tâche de cartographie à la liste des travailleurs de soutien cette tâche. Ensuite, votre patron n'a pas besoin d'itérer, mais peut regarder tout simplement tous les travailleurs qui prend en charge une tâche donnée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top