Modèle de façade en Java

introduction

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.

Motif de façade

Qu'est-ce que la façade

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é.

Personnage

Le modèle Façade est utilisé par les classes qui apparaissent dans le diagramme de classes ci-dessous. image.png

Classe d'implémentation

Exemple concret

À titre d'exemple concret, nous expliquerons en nous basant sur la classe suivante. image.png

Classe d'implémentation

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.

Autre

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.

Classe d'exécution

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. )

Résultat d'exécution

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***************

mérite

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.

Résumé

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.

Les références

Recommended Posts

Modèle de façade en Java
Motif singleton en Java
Modèle de poids mouche en Java
Modèle d'observateur en Java
Modèle d'itérateur en Java
Modèle de décorateur en Java
Modèle de prototype en Java
Modèle de proxy en Java
Modèle de méthode de modèle en Java
Modèle de chaîne de responsabilité en Java
Modèle de conception #Facade
Motif singleton en Python
Autorisations Linux sur Java
Utiliser DataFrame en Java
Modèle de visiteur en Python
Mettre en œuvre un test piloté par table en Java
Détectez et traitez les signaux en Java.
Implémenter le modèle Singleton en Python
Mise en œuvre du tri à bulles en Java (BubbleSort)
Résumé du modèle de conception Java GoF
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle de façade
Chevauchement d'expressions régulières en Python et Java
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Builder" avec Python
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Rendement Python express en JavaScript ou Java
Appliquer le formateur Google Java Style avec IntelliJ
Apprenez le modèle de conception "Commande" en Python
Différences entre la syntaxe Python et Java
Recevoir des e-mails à l'aide de l'API Gmail en Java
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
[Gang of Four] Apprentissage des modèles de conception - Façade
Apprenez le modèle de conception "Iterator" avec Python
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
Lançons le script Bash en Java
Apprenez le modèle de conception "Adapter" avec Python
Apprenez le modèle de conception "Façade" avec Python