Le modèle de méthode modèle du modèle de conception Java définit le cadre d'un algorithme de fonctionnement et reporte certaines étapes aux sous-classes, afin que les sous-classes puissent redéfinir certaines étapes spécifiques de l'algorithme sans modifier la structure de l'algorithme. Modèle comportemental
Comme indiqué ci-dessous :
En fait, la méthode modèle est un modèle fréquemment utilisé en programmation. Regardons d'abord un exemple. Un jour, le programmeur A a eu une tâche : étant donné un tableau d'entiers, trier les nombres du tableau de petit à grand, puis imprimer les résultats triés. Après analyse, cette tâche peut être grossièrement divisée en deux parties, le tri et l'impression. La fonction d'impression est facile à mettre en œuvre, mais le tri est un peu gênant. Mais A a un moyen de terminer d’abord la fonction d’impression et de trouver quelqu’un d’autre pour effectuer la fonction de tri.
abstract class AbstractSort { /** * Trier le tableau de petit à grand * @param array */ protected abstract void sort(int[] array); public void showSortResult(int[] array){ this.sort(array); System.out.print("Résultat du tri : "); for (int i = 0; i < array.length; i++){ System.out.printf("%3s", array[i]);
Après avoir fini d'écrire, A a trouvé son collègue B qui venait d'obtenir son diplôme et a récemment rejoint le poste et lui a dit : Il y a une tâche, j'ai déjà écrit la logique principale. Vous pouvez implémenter le reste de la logique. J'ai donc donné la classe AbstractSort à B et demandé à B d'écrire l'implémentation. B l'a repris et a jeté un œil. C'était trop simple. Cela pouvait être fait en 10 minutes. Le code est le suivant :
class ConcreteSort extends AbstractSort { @Override protected void sort(int[] array){ for(int i=0; i<array.length-1; i++){ selectSort(array, i } } private void selectSort(int[); ] array, int index) { int MinValue = 32767; // Variable de valeur minimale int indexMin = 0; // Variable d'index de valeur minimale int Temp; index; i < array.length; i++) { if (array[i] < MinValue){ // Trouver la valeur minimale MinValue = array[i]; // Stocker la valeur minimale indexMin = i } } Temp = array[ index] ; // Échanger deux valeurs array[index] = array[indexMin];
Après l'avoir écrit, remettez-le à A, et A l'exécutera :
public class Client { public static int[] a = { 10, 32, 1, 9, 5, 7, 12, 0, 4, 3 }; // Tableau de données par défaut public static void main(String[] args){ AbstractSort s = new ConcreteSort(); s.showSortResult(a }}
Résultats en cours d'exécution :
Résultats du tri : 0 1 3 4 5 7 9 10 12 32
Cela fonctionne bien. Bon, mission accomplie. Oui, il s'agit du modèle de méthode modèle. La plupart des diplômés qui viennent d'entrer sur le marché du travail devraient avoir une expérience similaire à celle de B. Pour une tâche complexe, les meilleures personnes de l'entreprise écriront la logique principale, puis écriront les méthodes apparemment simples en méthodes abstraites et les laisseront à d'autres collègues pour qu'elles les développent. Cette division du travail est souvent utilisée dans les entreprises disposant de niveaux évidents de personnel de programmation. Par exemple, si une équipe de projet comprend un architecte, un ingénieur senior et un ingénieur junior, l'architecte utilisera généralement un grand nombre d'interfaces et de classes abstraites pour enchaîner la logique de l'ensemble du système, et le codage de l'implémentation sera confié à l'ingénieur senior et l'ingénieur junior respectivement en fonction de la difficulté. Et si, avez-vous déjà utilisé le modèle de méthode modèle ?
La structure du modèle de méthode modèle :
Le modèle de méthode modèle se compose d'une classe abstraite et d'une (ou d'un groupe de) classes d'implémentation via une structure d'héritage. Les méthodes de la classe abstraite sont divisées en trois types :
1. Méthode abstraite : Elle est uniquement déclarée dans la classe parent mais non implémentée. Au lieu de cela, la spécification est définie puis implémentée par ses sous-classes.
2. Méthode template : déclarée et implémentée par une classe abstraite. De manière générale, les méthodes modèles appellent des méthodes abstraites pour compléter les fonctions logiques principales, et la plupart des méthodes modèles sont définies comme des types finaux, ce qui indique que les fonctions logiques principales ne peuvent pas être remplacées dans les sous-classes.
3. Méthode Hook : déclarée et implémentée par la classe abstraite. Mais les sous-classes peuvent être étendues et les sous-classes peuvent affecter la logique des méthodes modèles en étendant les méthodes hook.
La tâche des classes abstraites est de construire un cadre logique, généralement rédigé par du personnel expérimenté, car la qualité des classes abstraites détermine directement la stabilité du programme.
Les classes d'implémentation sont utilisées pour implémenter les détails. La méthode modèle dans la classe abstraite complète la logique métier en implémentant la méthode d'extension de classe. Tant que la méthode d'extension dans la classe d'implémentation réussit le test unitaire et que la méthode modèle est correcte, il n'y aura généralement pas d'erreurs majeures dans la fonction globale.
Avantages et scénarios applicables de la méthode modèle :
Facile à agrandir. De manière générale, la méthode modèle dans une classe abstraite est la partie qui n'est pas facile à modifier rétroactivement, tandis que la méthode abstraite est la partie qui est facile à modifier rétroactivement. Par conséquent, en ajoutant des classes d'implémentation, il est généralement facile d'étendre la fonction. , ce qui est conforme au principe d'ouverture et de fermeture.
Facile à entretenir. Pour le modèle de méthode modèle, c'est précisément parce que leur logique principale est la même que la méthode modèle est utilisée. Si la méthode modèle n'est pas utilisée, le même code peut être dispersé dans différentes classes, ce qui est très gênant à maintenir. .
Plus souple. En raison de la méthode hook, l'implémentation de la sous-classe peut également affecter le fonctionnement de la logique principale dans la classe parent. Cependant, tout en étant flexible, étant donné que la sous-classe affecte la classe parent, elle viole le principe de substitution de Liskov et comporte également des risques pour le programme. Cela impose des exigences plus élevées en matière de conception de classes abstraites.
Lorsque plusieurs sous-classes ont la même méthode et que la logique de ces méthodes est la même, vous pouvez envisager d'utiliser le modèle de méthode modèle. Ce mode est également plus adapté aux situations où le cadre principal du programme est le même mais les détails sont différents.