Maison > Java > javaDidacticiel > Explication détaillée du modèle de méthode de modèle du modèle de conception Java

Explication détaillée du modèle de méthode de modèle du modèle de conception Java

怪我咯
Libérer: 2017-07-02 10:45:16
original
1334 Les gens l'ont consulté

Cet article présente principalement les informations pertinentes sur le modèle de méthode de modèle de Java modèle de conception en détail. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

1. Qu'est-ce que le modèle de méthode modèle

Concept : Définir le squelette d'un algorithme dans une opération et reporter certaines étapes aux sous-classes. Les méthodes modèles permettent aux sous-classes de redéfinir des étapes spécifiques d'un algorithme sans modifier la structure de l'algorithme.

En termes simples, le modèle de méthode modèle réalise ses avantages en déplaçant le comportement inchangé vers la super classe et en supprimant le code en double dans la sous-classe. Il fournit une bonne plate-forme de réutilisation de code. Lorsque des méthodes immuables et mutables sont mélangées dans une sous-classe, la méthode immuable apparaîtra plusieurs fois dans la sous-classe, donc si une méthode doit être modifiée, de nombreuses méthodes doivent être modifiées, même si ce problème doit être réfléchi au niveau initial. début de la conception. À ce stade, le modèle de méthode modèle entre en jeu. Grâce au modèle de méthode modèle, ces méthodes récurrentes sont déplacées vers un seul endroit, ce qui peut aider les sous-classes à se débarrasser de l'enchevêtrement de la répétition.

Pour donner un exemple facile à comprendre, la famille de l'auteur était pauvre quand j'étais enfant Quand j'allais à l'école primaire en zone rurale, chaque élève devait rédiger à la main les copies de test parce que l'école. n’avait pas de papiers de test imprimés à ce moment-là. Il y avait plus de cinquante élèves dans la classe. Chaque élève devait copier le test au tableau à plusieurs reprises, et une personne myope comme moi pouvait facilement faire des erreurs. 8 devenait 3, 7 devenait 1, etc., et puis évidemment. J'ai bien compris, mais les notes n'étaient pas élevées, ce qui m'a fait toujours être au bas de la classe. Il s'agit d'un problème très grave de duplication et d'immuabilité. Désormais, les conditions sont bien meilleures. Les étudiants n'ont plus besoin de copier les copies de test. L'impression des copies de test résout ce problème de copie répétée des copies de test. La méthode du modèle est similaire.

2. Comparaison des modes

1. Mode de copie du papier test

L'auteur utilise le nom de copie du papier test. mode pour expliquer la répétition En raison des inconvénients causés par le changement, le modèle sera amélioré ci-dessous.

Épreuve d'examen copiée par l'étudiant A

public class TestPaperA {
 //试卷第一题
 public void testQuestion1(){
  System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
  System.out.println("答案:C");
 }
 
 //试卷第二题
 public void testQuestion2(){
  System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
  System.out.println("答案:C");
 }
 
 //试卷第三题
 public void testQuestion3(){
  System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
  System.out.println("答案:B");
 }
}
Copier après la connexion

Épreuve d'examen copiée par l'étudiant B

public class TestPaperB {
 //试卷第一题
 public void testQuestion1(){
  System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
  System.out.println("答案:A");
 }
 
 //试卷第二题
 public void testQuestion2(){
  System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
  System.out.println("答案:C");
 }
 
 //试卷第三题
 public void testQuestion3(){
  System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
  System.out.println("答案:D");
 }
}
Copier après la connexion

Code client

public class ShowAnswer {

 public static void main(String[] args) {
  System.out.println("学生甲的试卷");
  TestPaperA stuA = new TestPaperA();
  stuA.testQuestion1();
  stuA.testQuestion2();
  stuA.testQuestion3();
  System.out.println("学生乙的试卷");
  TestPaperB stuB = new TestPaperB();
  stuB.testQuestion1();
  stuB.testQuestion2();
  stuB.testQuestion3();
 }

}
Copier après la connexion

C'est facile pour trouver ce qui précède Les copies de test copiées par les deux étudiants comportent de nombreux doublons, tels que les questions de la copie de test et la méthode de sortie des réponses. Ceux-ci sont tous mélangés dans la catégorie de copie de test de chaque élève, ce qui n'est pas propice à la maintenance. ou la navigation. Jetons un coup d'œil au modèle. Comment améliorer le modèle de méthode.

2. Mode méthode modèle

Extraire les parties répétées de l'épreuve, des questions, des réponses, etc.

Tout d'abord, transformez la classe de papier test et changez-la en Classe abstraite Dans ce cours, j'ai ajouté trois méthodes abstraites pour la mise en œuvre des sous-classes, et les étudiants doivent répondre. différent, de sorte que le processus de réponse peut être extrait comme une méthode répétée et inchangée. Le code est le suivant.

public abstract class TestPaper {
 //试卷第一题
 public void testQuestion1(){
  System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
  System.out.println("答案:" + answer1());
 }
 
 //试卷第二题
 public void testQuestion2(){
  System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
  System.out.println("答案:" + answer2());
 }
 
 //试卷第三题
 public void testQuestion3(){
  System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
  System.out.println("答案:" + answer3());
 }
 
 //这三个钩子方法是给每个子类去实现,并返回答案的
 public abstract String answer1();
 public abstract String answer2();
 public abstract String answer3();
 
 //模板方法,考试的过程,定义基本的考试过程,子类回调
 public void exam(){
  testQuestion1();
  testQuestion2();
  testQuestion3();
 }
}
Copier après la connexion

Regardons d'abord la situation de test du premier élève

public class TestPaperA extends TestPaper{

 @Override
 public String answer1() {
  return "A";
 }

 @Override
 public String answer2() {
  return "B";
 }

 @Override
 public String answer3() {
  return "D";
 }
 
}
Copier après la connexion

Les copies de test des autres étudiants peuvent avoir des réponses différentes, mais le processus de réponse de base est le même, donc là il n'y a aucune différence. Je l'ai réécrit, jetons un coup d'œil au code client.

public class ShowAnswer {

 public static void main(String[] args) {
  TestPaper testPaper = new TestPaperA();
  testPaper.exam();
 }

}
Copier après la connexion

On peut voir que le code client a également été considérablement réduit. Cela rend la logique claire et facile à maintenir. Les avantages sont évidents.

Quel parent de Yang Guo est Xiao Longnu ? () A. Petite tante B. Grand-tante C. Tante D. Tante
Réponse : A
Qui était le premier chef de la secte Quanzhen ? A. Zhou Botong B. Ouyang Feng C. Wang Chongyang D. Ximen Brag
Réponse : B
Qui est le héros nommé roi du campus sud dans « Dragon » ? A. Duan Yu B. Qiao Feng C. Murong Fu D. Duan Zhixing
Réponse : D

3.
AbstractClass est une classe abstraite, qui est en fait un modèle abstrait qui définit et implémente une méthode de modèle. Cette méthode modèle est généralement une implémentation concrète, qui donne un squelette logique, et la composition de la logique se trouve dans la classe abstraite correspondante, qui est reportée à l'implémentation de la sous-classe. Le code est le suivant

ConcreteClass, qui implémente une ou plusieurs méthodes abstraites définies par la classe parent. Chaque AbstractClass peut avoir une ou plusieurs ConcreteClass qui lui correspondent, et chaque ConcreteClass peut fournir différentes implémentations de ces méthodes abstraites (c'est-à-dire les étapes du squelette), donc les implémentations obtenues sont différentes.
public abstract class AbstractClass {

 //一些抽象行为,可以理解为重复不变的方法,提取到抽象类
 public abstract void primitiveOperation1();
 public abstract void primitiveOperation2();
 
 //模板方法,给出了具体逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现
 public void templateMothed(){
  primitiveOperation1();
  primitiveOperation2();
 }
 
}
Copier après la connexion

public class ConcreteClassA extends AbstractClass{

 @Override
 public void primitiveOperation1() {
  System.out.println("子类A的操作1");
 }

 @Override
 public void primitiveOperation2() {
  System.out.println("子类A的操作2");
 }

}
Copier après la connexion
Deux implémentations spécifiques sont définies ci-dessus. D'autres implémentations sont en fait les mêmes, je n'entrerai donc pas dans les détails ici. Jetons un coup d'œil au code client
public class ConcreteClassB extends AbstractClass{

 @Override
 public void primitiveOperation1() {
  System.out.println("子类B的操作1");
 }

 @Override
 public void primitiveOperation2() {
  System.out.println("子类B的操作2");
 }

}
Copier après la connexion

Entrez ce qui suit
public class Show {

 public static void main(String[] args) {
  AbstractClass c;
  c = new ConcreteClassA();
  c.templateMothed();
  c = new ConcreteClassB();
  c.templateMothed();
 }
 
}
Copier après la connexion

Opération 1 de la sous-classe A

Opération 2 de la sous-classe AOpération 1 de la sous-classe B
Opération 2 de la sous-classe B


4 Diagramme UML


Résumé

Le modèle de méthode modèle consiste à extraire du code répétitif et inchangé dans une classe abstraite. Lorsque nous voulons terminer un processus ou une série d'étapes qui sont cohérentes à un certain niveau de détail, mais que la mise en œuvre des étapes individuelles à un niveau plus détaillé peut être différente, nous envisageons généralement d'utiliser le modèle de méthode modèle pour y faire face.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal