English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
L'exemple de cet article décrit le patron de stratégie dans la programmation Android. Partageons-le avec vous pour vous fournir une référence, voici les détails :
I. Présentation
Dans le développement de logiciels, on rencontre souvent ce genre de situation : pour réaliser une fonction, il peut y avoir plusieurs algorithmes ou stratégies, et nous choisissons différents algorithmes ou stratégies en fonction de la situation réelle pour réaliser cette fonction. Par exemple, pour les algorithmes de tri, on peut utiliser le tri par insertion, le tri par fusion, le tri par bulles, etc.
Pour cette situation, une méthode courante consiste à écrire plusieurs algorithmes dans une même classe. Par exemple, pour fournir plusieurs algorithmes de tri, on peut les écrire dans une même classe, chaque méthode correspondant à un algorithme de tri spécifique : bien sûr, on peut également encapsuler ces algorithmes de tri dans une méthode unifiée, en utilisant des instructions de jugement conditionnelles comme if...else... ou case pour choisir l'algorithme spécifique. Ces deux méthodes d'implémentation peuvent tous deux être appelées codage rigide. Cependant, lorsque de nombreux algorithmes sont regroupés dans une même classe, cette classe devient volumineuse, le coût de maintenance de cette classe augmente, et il est plus facile de commettre des erreurs lors de la maintenance. Si nous devons ajouter un nouvel algorithme de tri, nous devons modifier le code source de la classe encapsulant les algorithmes. Cela viole manifestement le principe OCP et le principe de responsabilité unique.
Si l'on abstrait ces algorithmes ou stratégies et qu'on fournit une interface unifiée, différentes algorithmes ou stratégies ont des classes d'implémentation différentes, ainsi, dans le client du programme, on peut injecter des objets d'implémentation différents pour réaliser le remplacement dynamique des algorithmes ou stratégies. Ce modèle a une meilleure extensibilité et maintenabilité, c'est ce que nous appelons le patron de stratégie dans cette section.
En termes simples, c'est généralement que si un problème a plusieurs solutions, la plus simple est d'utiliser if-else ou switch-La méthode case permet de choisir différentes solutions en fonction de différentes situations, mais cela entraîne une forte couplage, un code volumineux et difficile à maintenir. Dans ce cas, le modèle de stratégie peut être utilisé pour résoudre ce problème.
Deux, définition
Le modèle de stratégie définit une série d'algorithmes, encapsule chaque algorithme et les rend interchangeables. Le modèle de stratégie permet aux algorithmes de changer indépendamment de leurs clients.
Trois, scénarios d'utilisation
Pour plusieurs méthodes de traitement de problèmes du même type, où seules les actions concrètes diffèrent
Lorsqu'il est nécessaire de encapsuler en toute sécurité plusieurs opérations du même type
Lorsqu'il y a plusieurs sous-classes de la même classe abstraite et qu'il est nécessaire d'utiliser if-else ou switch-case pour choisir la sous-classe spécifique
Quatre, diagramme UML du modèle de stratégie
Diagramme UML :
Context : environnement d'opération de la stratégie.
Stragety : abstraction de la stratégie.
ConcreteStrategyA、ConcreteStrategyB : implémentation concrète des stratégies.
Cinq, implémentation simple
Exigence : calculer le prix du livre, les membres débutants n'ont pas de rabais, les membres intermédiaires ont un rabais de9rabais, les membres高级会员 ont un rabais de8rabais. Si la méthode d'écriture générale, il devrait être if-else pour déterminer quel niveau de membre il s'agit, puis calculer le rabais correspondant. Pour cela, nous utilisons le modèle de stratégie.
Classe abstraite de rabais :
public interface MemberStrategy { /** * Calculer le prix du livre * @param booksPrice Le prix d'origine du livre * @return Calculer le prix après réduction */ public double calcPrice(double booksPrice); }
Classe de rabais pour membres初级会员:
public class PrimaryMemberStrategy implements MemberStrategy{ /** * 折扣初级会员 */ @Override public double calcPrice(double booksPrice) { System.out.println("Pour les membres débutants, il n'y a pas de rabais"); return booksPrice; } }
Classe de rabais pour membres中级会员:
public class IntermediateMemberStrategy implements MemberStrategy{ /** * 折扣中级会员 */ @Override public double calcPrice(double booksPrice) { System.out.println("Pour les membres intermédiaires, le rabais est de ",10%); return booksPrice * 0.9; } }
Classe de rabais pour membres高级会员:
public class AdvancedMemberStrategy implements MemberStrategy{ /** * 折扣高级会员 */ @Override public double calcPrice(double booksPrice) { System.out.println("Pour les membres premium, la réduction est de"}20% "); return booksPrice * 0.8; } }
Classe de prix :
public class Price { //Maintient un objet de stratégie spécifique private MemberStrategy strategy; /** * Constructeur, transmet un objet de stratégie spécifique * @param strategy L'objet de stratégie spécifique */ public Price(MemberStrategy strategy){ this.strategy = strategy; } /** * Calculer le prix du livre * @param booksPrice Le prix d'origine du livre * @return Calculer le prix après réduction */ public double quote(double booksPrice){ return this.strategy.calcPrice(booksPrice); } }
Client :
public class Client { public static void main(String[] args) { //Choisir et créer l'objet de stratégie à utiliser MemberStrategy strategy1 = new AdvancedMemberStrategy(); //Créer un environnement Price price = new Price(strategy1); //Calculer le prix double quote = price.quote(300); System.out.println("Le prix final du livre est de : ") + quote); } }
Résultat :
Pour les membres premium, la réduction est de20% Le prix final du livre est de :240.0
Différence entre le modèle de stratégie et le modèle d'usine
Modèle d'usine | Modèle de stratégie |
---|---|
Modèle de conception de création | Modèle de conception comportemental |
Considérer la création de l'objet | Considérer le choix du comportement |
Boîte noire (sans avoir besoin de savoir le processus d'implémentation spécifique) | Boîte blanche (savoir le processus d'implémentation spécifique) |
Stratégie de mode d'implémentation dans le code source d'Android
Avec le développement de la technologie, les ingénieurs accordent de plus en plus d'importance à l'expérience utilisateur et à l'interaction utilisateur. Par conséquent, l'animation est devenue une partie indispensable de nombreuses applications. Même une page de guide simple doit être rendue animée, et l'effet d'apparition et de disparition d'un bouton doit également être ajouté.24images par seconde/Seconde. Lorsque les animations sont fluides, elles peuvent atteindre60 frames/Secondes, l'œil humain ne voit presque pas l'intervalle, donc, nous voyons cette animation très fluide.
Une animation simple ne suffit pas à répondre à nos besoins. Pendant l'exécution de l'animation, nous avons besoin de certains effets dynamiques, un peu comme les plans ralentis dans un film. Parfois, nous avons besoin de ralentir, parfois d'accélérer, de sorte que l'animation devienne plus vivante. Ces effets dynamiques sont réalisés par des interpolateurs (TimeInterpolator), et nous pouvons réaliser différents effets dynamiques en configurant différents interpolateurs pour l'objet Animation.
LinearInterpolator, AccelerateInterpolator, CycleInterpolator, etc., implémentent l'Interpolator, obtenus par getInterpolator(float input) pour obtenir le pourcentage de temps actuel, afin de calculer la valeur de l'attribut de l'animation.
Huit, conclusion
Le pattern Strategy est principalement utilisé pour séparer les algorithmes, avec différentes stratégies d'implémentation spécifiques sous le même comportement abstrait. Ce modèle démontre bien le principe d'ouverture et de fermeture, c'est-à-dire définir l'abstraction, injecter différentes implémentations, et ainsi atteindre une excellente extensibilité.
Avantages :
La structure est claire et évidente, et l'utilisation est simple et intuitive.
La cohésion est relativement faible, et l'extension est facile.
L'encapsulation des opérations est plus complète, et les données sont plus sécurisées.
Inconvénients :
Avec l'ajout de stratégies, les sous-classes deviennent nombreuses.
Les lecteurs intéressés par plus de contenu sur Android peuvent consulter les thèmes spéciaux de ce site : 'Entrée et avancement dans le développement Android', 'Trucs de débogage et solutions de problèmes courants Android', 'Résumé des utilisations des composants de base Android', 'Résumé des techniques des vues View Android', 'Résumé des techniques de layout Android' et 'Résumé des utilisations des contrôles Android'.
J'espère que cet article sera utile pour la conception de programmes Android.
Déclaration : le contenu de cet article est issu d'Internet, propriété de ses auteurs respectifs. Le contenu est contribué et téléversé par les utilisateurs d'Internet, ce site ne détient pas de droits de propriété, n'a pas été édité par l'homme et n'assume aucune responsabilité juridique. Si vous trouvez du contenu présumé violant les droits d'auteur, vous pouvez envoyer un e-mail à : notice#w3Pour signaler une violation, veuillez remplacer le # par @ dans l'e-mail et fournir des preuves pertinentes. Une fois vérifié, le site supprimera immédiatement le contenu présumé illicite.