Présentation des modèles de conception de [GoF](https://ja.wikipedia.org/wiki/Gang of for _ (Information Engineering)) ["Introduction aux modèles de conception appris dans le langage Java augmenté et révisé"]( https://www.amazon.co.jp/ Édition augmentée et révisée Introduction aux modèles de conception appris en langage Java-Yuki-Hiroshi / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5QMHP) Je vais résumer sur.
Traduit en japonais, cela signifie «façade (du bâtiment)». Si vous utilisez un programme qui implique plusieurs classes, vous devez exécuter les méthodes de chaque classe dans le bon ordre. Par exemple, "Si vous souhaitez exécuter le processus X, appelez la méthode B de la classe A, puis les méthodes D et E de la classe C et enfin la méthode G de la classe F." Il n'y avait pas beaucoup de classes et de méthodes dans l'exemple ci-dessus, mais plus le nombre est élevé, plus le contrôle des classes et des méthodes est complexe lors du traitement **. ** ** Dans un tel cas, le modèle ** qui fournit une interface (API) qui sert de "fenêtre" lorsqu'il est visualisé à partir du demandeur de traitement est appelé le ** modèle de façade **. En appliquant ce modèle, le demandeur n'a pas besoin de connaître le contrôle d'un traitement compliqué.
Le modèle Façade est utilisé par les classes qui apparaissent dans le diagramme de classes ci-dessous.
Facade C'est une classe qui rassemble les classes pour le traitement et sert de ** point de contact pour le client **. Il n'y a pas de restrictions particulières sur le contenu à mettre en œuvre, et il n'y a pas de points difficiles.
** Autres classes ** Ce sont les classes qui sont appelées pour effectuer le traitement. Il n'y a pas de restrictions particulières sur ce qui doit être mis en œuvre. Il n'y a rien de particulièrement difficile, mais le fait est que les classes utilisées ne connaissent pas la Façade, qui est le point de contact. C'est parce que les autres classes n'appellent pas Facade.
Client Une classe qui appelle Facade. Il n'y a pas de restrictions particulières sur le contenu à mettre en œuvre, et il n'y a pas de points difficiles.
À titre d'exemple concret, nous expliquerons en nous basant sur la classe suivante.
ListFacade.java
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
public class ListFacade {
private ListFacade() { //Déclaration privée pour empêcher l'instanciation avec new
}
public static void makeMemberList(String inputFileName, String outputFileName) {
try {
Properties memberProperties = MemberList.getProperties(inputFileName);
outputFileName = "C:\\work\\Facade\\src\\" + outputFileName + ".txt";
TxtWriter writer = new TxtWriter(new FileWriter(outputFileName));
Map<String, String> propertiesMap = writer.toMap(memberProperties);
writer.writeHeader();
writer.writeContents(propertiesMap);
writer.writeFooter();
writer.close();
System.out.println(String.format("Sortez le fichier. nom de fichier:%s", outputFileName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
La classe ListFacade
est le point de contact pour la classe Main
, qui est le client.
Vous pouvez voir que seule la méthode statis makeMemberList
est définie, elle reçoit une propriété de la classe MemberList
, reçoit une carte basée sur cette propriété et la renvoie dans un fichier.
Si le processus réussit, un message indiquant que le fichier a été sorti est envoyé à la console.
Le seul point est que ** le déroulement de ces processus est décrit dans la classe ListFacade
, qui est le point de contact, pas dans la classe Main
**.
Il n'y a rien de particulièrement difficile dans les modèles d'apprentissage.
MemberList.java
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class MemberList {
private MemberList() { //Déclaration privée pour empêcher l'instanciation avec new
}
public static Properties getProperties(String fileName) { //Obtenir les propriétés à partir du nom de fichier
fileName = "C:\\work\\Facade\\src\\" + fileName + ".txt";
Properties properties = new Properties();
try {
properties.load(new FileInputStream(fileName));
} catch (IOException e) {
System.out.println(String.format("Impossible de lire le fichier. nom de fichier:%s", fileName));
}
return properties;
}
}
C'est la première de deux autres classes.
Seule la méthode statique getProperties
est définie et renvoie le fichier de propriétés en recevant le nom du fichier.
Il n'y a rien de particulièrement difficile.
TxtWriter.java
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
public class TxtWriter {
private Writer writer;
public TxtWriter(Writer writer) { //constructeur
this.writer = writer;
}
//Recevoir la valeur de la propriété(Clé)Stocke plus de 25 dans la carte
public Map<String, String> toMap(Properties properties) {
Map<String, String> propertiesMap = new HashMap<>();
for (Entry<Object, Object> e : properties.entrySet()) {
if (Integer.parseInt((String) e.getValue()) > 25) {
propertiesMap.put(e.getKey().toString(), e.getValue().toString());
}
}
return propertiesMap;
}
//En-tête de sortie
public void writeHeader() throws IOException {
writer.write("***************Header***************");
writer.write(System.lineSeparator());
}
//Contenu de sortie
public void writeContents(Map<String, String> propertiesMap) throws IOException {
writer.write("Les membres suivants ont plus de 25 ans.");
writer.write(System.lineSeparator());
for (Entry<String, String> e : propertiesMap.entrySet()) {
writer.write("·Nom:" + e.getKey() + "âge:" + e.getValue());
writer.write(System.lineSeparator());
}
}
//Pied de page de sortie
public void writeFooter() throws IOException {
writer.write("***************Footer***************");
}
//Fermer
public void close() throws IOException {
writer.close();
}
}
C'est la deuxième des autres classes. Certaines méthodes sont définies, comme une méthode qui reçoit les propriétés et les stocke dans Map, et une méthode qui les renvoie dans un fichier texte, mais il n'y a rien de particulièrement difficile à ce sujet.
memberList.txt
#name=age
Tanaka_Tarou=25
Hoge_Hogeko=10
Yamada_Hanako=30
Neko_Nekota=50
Foo_Footarou=80
Il s'agit du fichier texte à lire par la classe MemberList
.
La clé est le nom et la valeur est l'âge.
Main.java
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 1.Lors de l'application du motif de façade
ListFacade.makeMemberList("memberList", "outputFile1");
// 2.Lorsque le motif de façade n'est pas appliqué
try {
String inputFileName = "memberList";
String outputFileName = "outputFile2";
Properties memberProperties = MemberList.getProperties(inputFileName);
outputFileName = "C:\\work\\Facade\\src\\" + outputFileName + ".txt";
TxtWriter writer = new TxtWriter(new FileWriter(outputFileName));
Map<String, String> propertiesMap = writer.toMap(memberProperties);
writer.writeHeader();
writer.writeContents(propertiesMap);
writer.writeFooter();
writer.close();
System.out.println(String.format("Sortez le fichier. nom de fichier:%s", outputFileName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
** 1. Lorsque le modèle Facade est appliqué **, vous pouvez exécuter le traitement souhaité simplement en appelant la méthode statique makeMemberList
pour la classeListFacade
qui est le point de contact.
De plus, si vous souhaitez effectuer le processus plusieurs fois, vous pouvez simplement appeler la méthode de la même manière. ,
** 2. Lorsque le modèle Facade n'est pas appliqué ** Dans le cas de **, le traitement cible ne peut être exécuté que si le contenu décrit dans la classe ListFacade
est décrit tel quel.
En outre, si vous souhaitez effectuer un traitement plusieurs fois, vous devez décrire autant de processus compliqués que vous le souhaitez.
(*** Cette fois, d'autres classes sont utilisées à partir de la classe Main, mais il est possible que vous puissiez utiliser d'autres classes uniquement à partir de la fenêtre en spécifiant protected en divisant le package **. Ici, afin de faciliter la compréhension de la différence entre utiliser Facade et ne pas l'utiliser, il est également possible de l'appeler depuis Client. )
Le résultat de l'exécution de Main.java
est le suivant.
Vous pouvez voir qu'il n'y a aucune différence dans les résultats du traitement entre le moment où le modèle est appliqué et celui où il ne l'est pas.
Résultat d'exécution(console)
Sortez le fichier. nom de fichier:C:\work\Facade\src\outputFile1.txt
Sortez le fichier. nom de fichier:C:\work\Facade\src\outputFile2.txt
Résultat d'exécution(outputFile1.txt)
***************Header***************
Les membres suivants ont plus de 25 ans.
・ Nom: Yamada_Hanako Âge: 30
・ Nom: Foo_Footarou Âge: 80
・ Nom: Neko_Nekota Âge: 50
***************Footer***************
Résultat d'exécution(outputFile2.txt)
***************Header***************
Les membres suivants ont plus de 25 ans.
・ Nom: Yamada_Hanako Âge: 30
・ Nom: Foo_Footarou Âge: 80
・ Nom: Neko_Nekota Âge: 50
***************Footer***************
Les avantages du modèle de façade sont les suivants. ** 1. ** Le code peut être simplifié car l'appelant n'a pas à écrire de contrôles détaillés. ** 2. ** Vous pouvez éviter que les appels involontaires ne deviennent des bogues. ** 3. ** En réduisant le port d'appel de l'interface, il peut être faiblement couplé avec l'extérieur, et la réutilisabilité est améliorée.
Vous avez découvert le modèle de façade, qui fournit une fenêtre pour contrôler des processus complexes. L'exemple de code est téléchargé ci-dessous, veuillez donc vous y référer si vous le souhaitez.
En outre, d'autres modèles de conception sont résumés ci-dessous, veuillez donc vous y référer également.
Recommended Posts