Es tut mir leid für den eingängigen oder Angel-Titel m (_ _;) m Kurz gesagt, ich werde erklären, wie das Muster der Vorlagenmethode praktisch verwendet wird. Es ist schwierig, den Codierungsstandard auf alle Entwicklungsmitglieder zu übertragen. Ich frage mich, ob es viele Dinge gibt, die schief gehen, wie Zeitmangel und schlechte Codeüberprüfungen, unterschiedliche Fähigkeiten und so weiter. Wenn Sie also mehrere Geschäftslogiken für mehrere Personen freigeben und erstellen möchten, sollten Sie die zugrunde liegende Klasse berücksichtigen, die die Implementierung dazu zwingt, die Codierungskonventionen einzuhalten.
Erzwingen, dass der Methodenname, das Argument und der Rückgabewert implementiert werden. Die einzige Regel "Diese Klasse muss erben" erzwingt den Methodennamen und seine Rolle für jede Geschäftslogikklasse. Der Punkt ist das Muster der Vorlagenmethode.
Die Struktur der Klasse ist wie folgt. DTO-Klasse: FooInfoDto.java, BarInfoDto.java ビジネスロジック親クラス:Proces.java Geschäftslogikklasse (Teil der Implementierungsfreigabe): ProcesHoge01.java, ProcesHoge02.java メインクラス(ビジネスロジック呼出し部分):Main.java
DTO "FooInfoDto" der Klasse (INPUT), die den Wert vor der Verarbeitung enthält, Erstellen Sie ein DTO "BarInfoDto" für die Klasse (OUTPUT), die die verarbeiteten Werte enthält. Da es sich um dasselbe Feld handelt, können sowohl INPUT als auch OUTPUT dasselbe DTO sein. Dies ist jedoch einfacher zu verwalten, da es besser ist, klar zu trennen, welcher Wert vor und nach der Verarbeitung beibehalten wird. Es ist überflüssig, aber es ist getrennt.
FooInfoDto.java
package dto;
public class FooInfoDto {
private Integer id = null;
private String value = null;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
BarInfoDto.java
package dto;
public class BarInfoDto {
private Integer id = null;
private String value = null;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Da der Methodenname und seine Rolle nur durch die Regel erzwungen werden können, dass "jede Geschäftslogik diese übergeordnete Klasse erbt und implementiert", ist es leicht zu verstehen, "welche Klasse welche Verarbeitung ausführt?" Werden. Der Zweck von abstrakten Klassen anstelle von Schnittstellen besteht darin, nur einige Verarbeitungsteile in jeder Geschäftslogik zu implementieren und gemeinsame Teile in dieser übergeordneten Klasse zu aggregieren.
Proces.java
package businesslogic;
import java.util.List;
import dto.BarInfoDto;
import dto.FooInfoDto;
public abstract class Proces {
protected abstract String getProcesName();
protected abstract void proces(List<FooInfoDto> input , List<BarInfoDto> output);
public void execute(List<FooInfoDto> in, List<BarInfoDto> out) {
System.out.println( getProcesName() + "Starten Sie die Verarbeitung." );
proces(in, out);
System.out.println( getProcesName() + "Die Verarbeitung ist abgeschlossen." );
}
}
Die "getProcesName-Methode" gibt die Rolle "einen beschreibenden Namen zurückgeben, um anzugeben, was die Klasse tut". Indem Sie den Modifikator auf "geschützt" setzen, können Sie verhindern, dass er von Klassen außerhalb des Pakets aufgerufen wird.
Die "Prozessmethode" ist eine abstrakte Methode, "um den tatsächlichen Verarbeitungsinhalt der Geschäftslogik zu implementieren". Setzen Sie den Modifikator erneut auf "protected", damit er nicht von Klassen außerhalb des Pakets aufgerufen werden kann.
Die "Ausführungsmethode" ist die einzige Methode, die von der Benutzerseite aufgerufen werden kann, dh die Hauptklasse (eine Klasse außerhalb des Businesslogic-Pakets). Hier können Sie die Hook-Verarbeitung, die Verarbeitungsreihenfolge usw. erzwingen.
Der Teil, den die Mitglieder tatsächlich implementieren.
ProcesHoge01.java
package businesslogic;
import java.util.List;
import dto.BarInfoDto;
import dto.FooInfoDto;
public class ProcesHoge01 extends Proces {
@Override
protected String getProcesName() {
return "Hoge01 Verarbeitung";
}
@Override
protected void proces(List<FooInfoDto> input, List<BarInfoDto> output) {
//Tatsächlicher Hoge-Verarbeitungsinhalt
int index = 0;
for( FooInfoDto dto : input ) {
Integer tmpId = dto.getId()*10;
output.get(index).setId(tmpId);
String tmpValue = dto.getValue()+"_Hoge01";
output.get(index).setValue(tmpValue);
index++;
}
}
}
ProcesHoge02.java
package businesslogic;
import java.util.List;
import dto.BarInfoDto;
import dto.FooInfoDto;
public class ProcesHoge02 extends Proces {
@Override
protected String getProcesName() {
return "Hoge02 Verarbeitung";
}
@Override
protected void proces(List<FooInfoDto> input, List<BarInfoDto> output) {
//Tatsächlicher Hoge-Verarbeitungsinhalt
int index = 0;
for( FooInfoDto dto : input ) {
Integer tmpId = dto.getId() + output.get(index).getId();
output.get(index).setId(tmpId);
String tmpValue = dto.getValue()+"_Hoge02";
output.get(index).setValue(tmpValue);
index++;
}
}
}
Tatsächlich ist es der Teil, der der Controller-Klasse entspricht. Hier wird es als eine Klasse implementiert, die leicht zu verstehen ist und einfach von der Hauptmethode ausgeführt wird. Ich habe die Pakete als Standard belassen, aber es wäre schön, wenn sie von den Paketen der Geschäftslogikklassen getrennt werden könnten.
Main.java
import java.util.ArrayList;
import java.util.List;
import businesslogic.ProcesHoge01;
import businesslogic.ProcesHoge02;
import dto.BarInfoDto;
import dto.FooInfoDto;
public class Main {
public static void main(String[] args) {
//DTO-Liste zum Speichern der Verarbeitungsergebnisse
List<BarInfoDto> out = new ArrayList<BarInfoDto>();
//Bereiten Sie eine zu verarbeitende Eingabe-DTO-Liste vor
List<FooInfoDto> in = new ArrayList<FooInfoDto>();
for(int i=1 ; i<4 ; i++){
FooInfoDto dto = new FooInfoDto();
dto.setId(i);
dto.setValue(i+"Zweiter Wert");
//In der zu verarbeitenden Eingabe-DTO-Liste festlegen
in.add(dto);
//Legen Sie in der DTO-Liste ein leeres DTO-Objekt fest, in dem das Verarbeitungsergebnis gespeichert ist
out.add(new BarInfoDto());
}
new ProcesHoge01().execute(in, out);
//Ergebnisanzeige
for(BarInfoDto dto : out) {
System.out.println( "-------------------------------" );
System.out.println( "ID nach der Verarbeitung> " + dto.getId() );
System.out.println( "Wert nach der Verarbeitung> " + dto.getValue() );
}
new ProcesHoge02().execute(in, out);
//Ergebnisanzeige
for(BarInfoDto dto : out) {
System.out.println( "-------------------------------" );
System.out.println( "ID nach der Verarbeitung> " + dto.getId() );
System.out.println( "Wert nach der Verarbeitung> " + dto.getValue() );
}
}
}
das ist alles.
Wie war es? Wir würden uns freuen, wenn Sie uns Ihre Meinung und Ihren Rat geben könnten. m (_ _) m
Ich denke, Sie können die Hauptklasse zu einer Fassadenklasse mit einem Fassadenmuster machen, um die Lesbarkeit weiter zu verbessern.
Recommended Posts