Définition: Définissez un ensemble d'algorithmes, encapsuler chaque algorithme et les rendre interchangeables.
Type: modèle de comportement
Diagramme de classe:
Le modèle de stratégie est l'encapsulation des algorithmes, encapsulant une série d'algorithmes en classes correspondantes, et ces classes implémentent la même interface et peuvent être remplacées par les autres. Dans le mode de classe comportementale mentionné ci-dessus, il existe un modèle qui se concentre également sur l'encapsulation de l'algorithme - le mode Modèle de modèle. Par rapport au diagramme de classe, vous pouvez voir que la différence entre le mode stratégie et le mode méthode de modèle est seulement qu'il existe un contexte de classe d'encapsulation distinct. La différence entre l'informatique et le mode de la méthode du modèle est: dans le mode de méthode du modèle, le corps principal de l'algorithme d'appel est dans la classe parent abstraite, tandis que dans le mode stratégie, le corps principal de l'algorithme d'appel est encapsulé dans le contexte de la classe d'encapsulation. La stratégie de stratégie abstraite est généralement une interface, le but est uniquement de définir la spécification et ne contient généralement pas de logique. En fait, ce n'est qu'une implémentation générale. Dans la programmation réelle, car il existe inévitablement une même logique entre chaque classe de mise en œuvre de stratégie spécifique, afin d'éviter le code en double, nous utilisons souvent des classes abstraites pour jouer le rôle de la stratégie et encapsuler le code public. Par conséquent, dans de nombreux scénarios d'application, l'ombre du modèle de méthode du modèle est généralement observée en mode stratégie.
Structure des modèles politiques
Classe d'encapsulation: Également connu sous le nom de contexte, l'encapsulation secondaire des politiques consiste à éviter les appels directs vers des politiques par des modules de haut niveau.
Stratégie abstraite: généralement une interface. Lorsqu'il y a une logique en double dans chaque classe d'implémentation, les classes abstraites sont utilisées pour encapsuler cette partie du code commun. Pour le moment, le modèle de stratégie ressemble plus au modèle de méthode de modèle.
Stratégie spécifique: les rôles de stratégie spécifiques sont généralement réalisés par un ensemble de classes encapsulées avec des algorithmes, et ces classes peuvent être remplacées librement au besoin.
Exemples de scénarios d'application:
Liu Bei va épouser sa femme à Jiangdong. Avant de partir, Zhuge Liang a donné à Zhao Yun (le meilleur homme) trois tours, disant que cela résoudrait le problème difficile en le démontant selon le secret du ciel. Hé, disons, ça a vraiment résolu le gros problème. En fin de compte, Zhou Yu a accompagné sa femme puis a brisé ses troupes. Voyons d'abord à quoi ressemble cette scène.
Parlons d'abord des éléments de cette scène: trois astuces intelligentes, une astuce intelligente et une astuce intelligente. L'astuce intelligente a été donnée par le frère Liang. L'astuce intelligente est communément appelée astuce intelligente. Ensuite, Zhao Yun est un travailleur qui sort le truc intelligent, l'exécute, puis gagne. Comment les exprimer en utilisant des programmes Java?
Jetons un coup d'œil à la photo en premier?
Les trois astuces sont le même type de choses, alors écrivons une interface:
Package com.yangguangfu.strategy; / ** * * @author [email protected]: afu * Définissez d'abord une interface de stratégie, qui est l'interface des trois astuces que Zhuge Liang a données à Zhao Yun. * / interface publique Istrategy {// Chaque astuce est un algorithme exécutable. public void operate (); }
Ensuite, écrivez trois classes d'implémentation, il y a trois astuces intelligentes:
Un plan intelligent: Première arrivée à Wu:
Package com.yangguangfu.strategy; / ** * * @author [email protected]: Un fu * Demandez à M. Qiao d'aider, afin que Sun Quan ne puisse pas tuer Liu Bei. * / classe publique Backdoor implémente Istrategy {@Override public void operate () {System.out.println ("Recherche de l'aide de l'ancien Qiao Guo, laissez Wu Guotai exercer une pression sur Sun Quan pour que Sun Quan ne puisse pas tuer Liu Bei ..."); }}
Le deuxième truc: veuillez donner à Wu Guotai un feu vert et laisser partir:
Package com.yangguangfu.strategy; / ** * * @author [email protected]: Un fu * Veuillez donner à Wu Guotai un feu vert. * / classe publique GivenGreenlight implémente Istrategy {@Override public void operate () {System.out.println ("Veuillez donner à Wu Guotai un feu vert, laissez-le aller!"); }}
Compétence 3: Mme Sun coupe l'arrière et bloque les poursuivants:
Package com.yangguangfu.strategy; / ** * * @author [email protected]: AFU * Mme Sun a coupé l'arrière et a bloqué les poursuivants. * / classe publique BlackEnemy implémente Istrategy {@Override public void operate () {System.out.println ("Mme. Sun coupe à l'arrière, bloque les Pursuers ..."); }}
D'accord, tout le monde, il y a trois astuces, donc il y a un endroit pour les mettre dans la pointe:
Package com.yangguangfu.strategy; / ** * * @author [email protected]: afu * * / public class context {private istrategy Strategy; // Constructeur, quelle astuce souhaitez-vous utiliser le contexte public (stratégie Istrategy) {this.strategy = stratégie; } public void operate () {this.strategy.operate (); }}
Ensuite, Zhao Yun portait trois conseils avec un grand courage, tirant le vieil homme Liu Bei, qui était déjà entré dans les rangs des personnes âgées et voulait épouser une fille innocente, est allée se marier avec sa femme. Salut, encore moins, les trois trucs de frère Liang sont vraiment bons. Regarder:
Package com.yangguangfu.strategy; classe publique Zhaoyun {/ ** * Zhao Yun est apparu. Selon l'explication de Zhuge Liang à lui, il a séparé les astuces à tour de rôle * / public statique vide main (String [] args) {context contextuel; // Quand je suis arrivé à Wu pour la première fois, j'ai démonté le premier système.out.println ("------------------------------------------"); context = nouveau contexte (new Backdoor ()); context.operate (); // exécuter System.out.println ("/ n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n"); //When Liu Bei was happy to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be unwilling to be ne veut pas ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne pas vouloir ne vouloir pas à ne pas dissuader le troisième système de pointe.out.println ("--------------------------------------------------"); context = nouveau contexte (new BlackEmy ()); context.operate (); // démonter et exécuter System.out.println("/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n/n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n / n
Avantages et inconvénients du mode politique Les principaux avantages du mode politique sont:
Les classes de stratégie peuvent être commutées librement et, comme les classes de stratégie implémentent la même abstraction, elles peuvent être commutées librement.
Facile à développer, l'ajout d'une nouvelle stratégie est très facile pour le modèle de politique, et il peut essentiellement être élargi sans modifier le code d'origine.
Évitez d'utiliser plusieurs conditions. Si vous n'utilisez pas le mode politique, pour tous les algorithmes, les instructions conditionnelles doivent être utilisées pour se connecter et l'algorithme à utiliser par jugement conditionnel. Dans l'article précédent, nous avons mentionné que l'utilisation d'un jugement conditionnel multiple est très difficile à maintenir.
Il y a deux principaux inconvénients du modèle de stratégie:
Le maintien de diverses classes politiques apportera des frais généraux supplémentaires au développement. Vous pouvez avoir de l'expérience à cet égard: d'une manière générale, le nombre de classes politiques dépasse 5, ce qui est plus gênant.
Toutes les classes de stratégie doivent être exposées au client (l'appelant) car il appartient au client d'utiliser, de sorte que le client doit savoir quelles politiques sont là et comprendre les différences entre diverses politiques, sinon les conséquences sont graves. Par exemple, il existe un modèle de stratégie pour le tri des algorithmes qui fournissent trois algorithmes: tri rapide, tri à bulles et sélection de tri. Avant que le client n'utilise ces algorithmes, devraient-ils comprendre l'application de ces trois algorithmes? Par exemple, le client doit utiliser un conteneur, qui est implémenté par des listes et des tableaux liés. Le client doit-il également comprendre la différence entre les listes et les tableaux liés? À cet égard, il est contraire à la loi dimitienne.
Scénarios applicables
Lorsque vous effectuez une conception orientée objet, vous devez être très familier avec le modèle de politique, car il est essentiellement l'héritage et le polymorphisme dans les objets. Après avoir lu le code général du modèle de politique, je pense que même si je n'ai jamais entendu parler du modèle de politique auparavant, je dois l'avoir utilisé pendant le processus de développement, non? Au moins dans les deux situations suivantes, vous pouvez envisager d'utiliser le modèle de stratégie.
La logique principale de plusieurs classes est la même, et il n'y a que de légères différences dans l'algorithme et le comportement de la logique partielle.
Il existe plusieurs comportements ou algorithmes similaires, et le client doit décider dynamiquement lequel utiliser, vous pouvez donc utiliser le modèle de stratégie pour résumer ces algorithmes à appeler le client.
Le modèle de stratégie est un modèle simple et couramment utilisé. Lorsque nous développons, nous l'utilisons souvent intentionnellement ou non. D'une manière générale, le modèle de stratégie ne sera pas utilisé seul, et il est plus courant de l'utiliser de manière mitigée avec le mode méthode du modèle, le mode d'usine, etc.