6
votes

Modèle de modèles de modèles pour classes statiques

J'ai une classe d'util qui effectue du travail. De toute évidence, il est fermé pour l'extension et toutes les méthodes sont statiques. Pour des raisons de simplicité, la classe ressemble à ceci: xxx

la classe a la méthode dowork qui effectue beaucoup de calculs. À propos, méthode appelle la méthode d'assistant Aide pour obtenir un certain résultat et que le reste du code utilise le résultat renvoyé par Aide méthode.

maintenant, dans Code client, je veux réutiliser la fonctionnalité de la méthode Dowork , mais au lieu d'appeler Aide Je veux appeler help2 méthode. La solution la plus simple vient de créer une méthode dowork2 avec le remplacement de Aide à help2 .

C'est une très mauvaise approche, car chaque changement Dans Dowork doit être répliqué dans Dowork2 non plus. Ceci très similaire à la méthode de modèle , mais en raison du fait que nous n'avons pas d'extension ici, nous ne pouvons pas l'appliquer.

meilleure solution que j'ai proposée pour ajouter Paramètre sur cette méthode, mais conserve tous les utilisateurs existants de dowork : xxx

Quelles sont les meilleures solutions de conception peuvent être appliquées pour résoudre ce problème? Existe-t-il un moyen d'obtenir une flexibilité comme le modèle a, mais en application à des classes utiles.

Merci d'avance.


3 commentaires

Y a-t-il une raison pour laquelle vous n'utilisez pas la surcharge de la méthode dans votre solution? Public Static Void Dowork () {...} Public statique Void Dowork (Boolean Param) {...}


Ou mieux encore Public statique Void Dowork (Int Variable) . Bien que je soupçonne que la réponse réelle est que la confusion est due à la statique et que les objets fourniraient une réponse plus propre - difficile à raconter avec les exemples abstraits cependant.


Ce que vous recherchez est le modèle de stratégie. Vérifiez la réponse de Arnaldo.


3 Réponses :


1
votes

Vous pouvez créer 2 objet statique help1 code> & help2 code> Mise en œuvre code> Aide code> Interface qui ont une méthode d'aide () et modifient votre méthode de DoworkwithParameter comme celle-ci :

public static void doWorkWithParameter(Help h) {
    int variable = h.help();
}


0 commentaires

1
votes

Pas si longtemps, j'ai fait ceci:

Helper.OLD.doWork();
Helper.NEW.doWork();


1 commentaires

Cela vient d'un livre Java efficace - "Item 34: émuler des énums extensibles avec des interfaces"



5
votes

Ma suggestion est inspirée dans le Modèle de commande , où Util Class est une invocataire et chaque dowork -Les paires de critères sont encapsulées à l'aide de l'interface de travailleur.

L'inteface travailleur pourrait être un peu comme xxx

la classe util xxx

Le travailleur concret (implémentations d'aide et de Dowork) xxx

un autre travailleur xxx

et l'exécution xxx


2 commentaires

Au lieu de l'interface de travailleur, vous feriez mieux de le faire comme une classe abstraite avec une méthode de Dowork (). C'est en fait la même chose que ce que je suggère, mais juste avec plus de code. Vous avez quatre cours au lieu d'un. Je suppose que Enums sont un meilleur remplacement de méthodes statiques.


Super! Il ressemble à un modèle de stratégie collections.sort (LST, comparateur) . Comment pourrais-je manquer ça?