Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung des Vorlagenmethodenmusters des Java-Entwurfsmusters

Detaillierte Erläuterung des Vorlagenmethodenmusters des Java-Entwurfsmusters

怪我咯
怪我咯Original
2017-07-02 10:45:161232Durchsuche

In diesem Artikel werden hauptsächlich die relevanten Informationen zum Vorlagenmethodenmuster von Java im Detail vorgestellt. Interessierte Freunde können sich auf

1 beziehen. Was ist das Vorlagenmethodenmuster?

Konzept: Definieren Sie das Grundgerüst eines Algorithmus in einer Operation und verschieben Sie einige Schritte auf Unterklassen. Mithilfe von Vorlagenmethoden können Unterklassen bestimmte Schritte eines Algorithmus neu definieren, ohne die Struktur des Algorithmus zu ändern.

Um es für den Laien auszudrücken: Das Muster der Vorlagenmethode entfaltet seine Vorteile, indem es unverändertes Verhalten in die Superklasse verschiebt und doppelten Code in der Unterklasse entfernt. Es bietet eine gute Plattform für die Wiederverwendung von Code. Wenn unveränderliche und veränderliche Methoden in einer Unterklasse gemischt werden, erscheint die unveränderliche Methode mehrmals in der Unterklasse. Wenn also eine Methode geändert werden muss, müssen viele Methoden geändert werden. Obwohl dieses Problem vorliegt, sollte dies durchdacht werden Beginn des Entwurfs. Zu diesem Zeitpunkt kommt das Vorlagenmethodenmuster ins Spiel. Durch das Vorlagenmethodenmuster werden diese wiederkehrenden Methoden an einen einzigen Ort verschoben, was dazu beitragen kann, dass Unterklassen die Verschränkung durch Wiederholungen beseitigen.

Um ein leicht verständliches Beispiel zu nennen: Die Familie des Autors war arm, als ich ein Kind in der Grundschule in ländlichen Gebieten war, musste jeder Schüler die Prüfungsarbeiten handschriftlich schreiben Ich hatte zu diesem Zeitpunkt noch keine Testpapiere gedruckt. Es waren mehr als fünfzig Schüler in der Klasse, die die Prüfungsarbeit wiederholt an die Tafel schreiben mussten, und ein kurzsichtiger Mensch wie ich konnte leicht aus 8 eine 3, aus 7 eine 1 usw. machen und dann offensichtlich Ich habe es richtig gemacht, aber die Punktzahlen waren nicht hoch, was dazu führte, dass ich immer am Ende der Klasse lag. Dies ist ein sehr ernstes Problem der Duplizierung und Unveränderlichkeit. Die Bedingungen für das Kopieren von Testpapieren sind jetzt viel besser. Die Vorlagenmethode ist ähnlich.

2. Vergleich der Modi

1. Kopiertestpapiermodus


Der Autor verwendet den Namen des Kopiertestpapiers Modus zur Erklärung der Wiederholung Aufgrund der durch die Änderung verursachten Unannehmlichkeiten wird das Modell im Folgenden verbessert.

Prüfungsarbeit von Schüler A kopiert

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");
 }
}
Prüfungsarbeit von Schüler B kopiert

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");
 }
}
Kundencode

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();
 }

}
Es ist einfach Um das Obige zu finden, gibt es viele Duplikate in den von den beiden Schülern kopierten Prüfungsarbeiten, z. B. die Fragen der Prüfungsarbeit und die Methode zur Ausgabe der Antworten. Diese sind alle in der Prüfungsarbeitskategorie jedes Schülers gemischt, was nicht förderlich ist Zur Wartung oder zum Durchsuchen werfen wir einen Blick auf die Vorlage.

2. Vorlagenmethodenmodus


Extrahieren Sie die wiederholten Teile der Testarbeit, Fragen, Antworten usw. jedes Schülers.

Transformieren Sie zunächst die Testpapierklasse und ändern Sie sie in eine

Abstrakte Klasse. In dieser Klasse habe ich drei abstrakte Methoden für die Unterklassenimplementierung hinzugefügt, und die Schüler müssen antworten unterschiedlich, sodass der Antwortvorgang als wiederholte und unveränderte Methode extrahiert werden kann. Der Code lautet wie folgt.

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();
 }
}
Sehen wir uns zunächst die Prüfungssituation des ersten Schülers an

public class TestPaperA extends TestPaper{

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

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

 @Override
 public String answer3() {
  return "D";
 }
 
}
Die Prüfungsaufgaben anderer Schüler haben möglicherweise unterschiedliche Antworten, aber der grundlegende Antwortprozess ist derselbe Es gibt keinen Unterschied. Ich habe es noch einmal geschrieben. Schauen wir uns den Client-Code an.

public class ShowAnswer {

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

}
Es ist ersichtlich, dass auch der Client-Code stark vereinfacht wurde. Dadurch ist die Logik klar und einfach zu pflegen. Die Vorteile liegen auf der Hand.

Welcher Verwandter von Yang Guo ist Xiao Longnu? () A. Kleine Tante B. Großtante C. Tante D. Tante Antwort: A
Wer war das erste Oberhaupt der Quanzhen-Sekte? A. Zhou Botong B. Ouyang Feng C. Wang Chongyang D. Ximen Brag
Antwort: B
Wer ist der Held, der in „Dragon“ als König des Südcampus bezeichnet wird? A. Duan Yu B. Qiao Feng C. Murong Fu D. Duan Zhixing
Antwort: D

3. Die Grundstruktur des Vorlagenmethodenmusters


AbstractClass ist eine abstrakte Klasse, bei der es sich tatsächlich um eine abstrakte Vorlage handelt, die eine Vorlagenmethode definiert und implementiert. Bei dieser Vorlagenmethode handelt es sich im Allgemeinen um eine konkrete Implementierung, die ein gewisses logisches Grundgerüst liefert, und die Zusammensetzung der Logik erfolgt in der entsprechenden abstrakten Klasse, die auf die Implementierung der Unterklasse verschoben wird. Der Code lautet wie folgt:

public abstract class AbstractClass {

 //一些抽象行为,可以理解为重复不变的方法,提取到抽象类
 public abstract void primitiveOperation1();
 public abstract void primitiveOperation2();
 
 //模板方法,给出了具体逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现
 public void templateMothed(){
  primitiveOperation1();
  primitiveOperation2();
 }
 
}
ConcreteClass, das eine oder mehrere abstrakte Methoden implementiert, die von der übergeordneten Klasse definiert werden. Jede AbstractClass kann über eine oder mehrere entsprechende ConcreteClass verfügen, und jede ConcreteClass kann unterschiedliche Implementierungen dieser abstrakten Methoden (dh die Schritte des Grundgerüsts) bereitstellen, sodass die erhaltenen Implementierungen unterschiedlich sind.

public class ConcreteClassA extends AbstractClass{

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

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

}
public class ConcreteClassB extends AbstractClass{

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

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

}
Zwei spezifische Implementierungen sind oben definiert. Weitere Implementierungen sind tatsächlich gleich, daher werde ich hier nicht auf Details eingehen. Schauen wir uns den Client-Code an

public class Show {

 public static void main(String[] args) {
  AbstractClass c;
  c = new ConcreteClassA();
  c.templateMothed();
  c = new ConcreteClassB();
  c.templateMothed();
 }
 
}
Geben Sie Folgendes ein

Operation 1 der Unterklasse AOperation 2 der Unterklasse A
Operation 1 der Unterklasse B
Operation 2 der Unterklasse B

4. UML-Diagramm


3 >
Das Vorlagenmethodenmuster besteht darin, sich wiederholenden und unveränderten Code in eine abstrakte Klasse zu extrahieren. Wenn wir einen Prozess oder eine Reihe von Schritten abschließen möchten, die auf einer bestimmten Detailebene konsistent sind, die Implementierung einzelner Schritte auf einer detaillierteren Ebene jedoch unterschiedlich sein kann, ziehen wir normalerweise die Verwendung des Vorlagenmethodenmusters in Betracht, um damit umzugehen.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Vorlagenmethodenmusters des Java-Entwurfsmusters. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn