Expliquez brièvement à quoi sert le modèle de façade (avec du code)
En termes simples, ** un coordinateur pour plusieurs processus **. Par conséquent, il est utile dans la mesure où il peut effectuer divers travaux avec une seule demande.
Source: Wiki --Modèle de façade
C'est une spécification du point de vue que Librarian a BookList et LendingList, et il n'y a aucun changement dans l'implémentation elle-même de son utilisation comme fenêtre.
Façade: classe de bibliothécaire Sous-système: classe BookList, classe LendingList Client: Classe de visiteur
Librarian.java
package facade;
//bibliothécaire
public class Librarian {
private BookList _bookList;
private LendingList _lendingList;
Librarian(BookList bookList, LendingList lendingList){
_bookList = bookList;
_lendingList = lendingList;
}
public String searchBook(String bookName) {
//Est-il en possession?
if(!_bookList.existsBook(bookName)) return "Le livre n'est pas en possession";
//Est-ce sur l'étagère?
if (_lendingList.isLending(bookName)) return "Prêt";
//Lieu de collecte
return _bookList.searchLocation(bookName);
}
}
BookList.java
package facade;
import java.util.HashMap;
import java.util.Map;
//Registre des collections
public class BookList {
private Map<String, String> _record = new HashMap<String, String>();
public void addRecord(String bookName, String locationName) {
_record.put(bookName, locationName);
}
public boolean existsBook(String bookName) {
return _record.containsKey(bookName);
}
public String searchLocation(String bookName) {
return (String)_record.get(bookName);
}
}
LendingList.java
package facade;
import java.util.ArrayList;
import java.util.List;
//Livre de prêt
public class LendingList {
private List<String> _record = new ArrayList<String>();
public void lending(String bookName) {
_record.add(bookName);
}
public void returned(String bookName) {
_record.remove(bookName);
}
public boolean isLending(String bookName) {
return _record.contains(bookName);
}
}
Visitor.java
package facade;
public class Visitor {
private String _name;
private String _targetBookName;
Visitor(String name){
_name = name;
}
public void setTargetBookName(String targetBookName) {
_targetBookName = targetBookName;
}
public String targetBookName() {
return _targetBookName;
}
public String name() {
return _name;
}
}
Main.java
package facade;
import java.io.PrintStream;
public class Main {
public static void main(String[] args) {
//Jeu de valeurs initiales
// (Liste des collections)
BookList bookList = new BookList();
bookList.addRecord("Livre illustré d'insectes", "Étagère numéro 1");
bookList.addRecord("Livre d'images animalières", "Étagère numéro 1");
bookList.addRecord("Momotaro", "Étagère numéro 2");
bookList.addRecord("Kintaro", "Étagère numéro 2");
bookList.addRecord("Comment fonctionne l'ordinateur", "Étagère numéro 3");
bookList.addRecord("Programmation Java", "Étagère numéro 3");
// (Liste de prêt)
LendingList lendingList = new LendingList();
lendingList.lending("Livre illustré d'insectes");
lendingList.lending("Momotaro");
lendingList.lending("Comment fonctionne l'ordinateur");
PrintStream out = System.out;
//utilisateur[Yamada-kun]:bibliothécaire[Nakamura-kun]Lors de la demande
Visitor yamada = new Visitor("Yamada");
yamada.setTargetBookName("Livre illustré d'insectes");
// (Fenêtre[Nakamura-kun])
Librarian nakamura = new Librarian(bookList, lendingList);
// (Poser une question à Nakamura-kun sur l'emplacement du livre d'images d'insectes)
out.println(yamada.name() + "Résultat:");
out.println(nakamura.searchBook(yamada.targetBookName()));
out.println();
//utilisateur[Kinoshita-kun]: Lors de la recherche par vous-même
Visitor kinoshita = new Visitor("Kinoshita");
kinoshita.setTargetBookName("Livre d'images animalières");
if(!bookList.existsBook(kinoshita.targetBookName())) {
out.println("Faisons un autre livre");
return;
}
if(lendingList.isLending(kinoshita.targetBookName())) {
out.println("Faisons un autre livre");
return;
}
out.println(kinoshita.name() + "Résultat:");
out.println(bookList.searchLocation(kinoshita.targetBookName()));
out.println();
}
}
Veuillez changer le targetBookName de Yamada-kun et Kinoshita-kun et vérifier l'opération.
Github https://github.com/TakumiKondo/designpattern/tree/master/src/facade/librarian
Une fois que vous commencez à écrire une série de code qui appelle plusieurs processus à divers endroits, Pensez à utiliser le modèle de façade.
Cependant, comme l'exigence l'indique, elle ne doit pas contenir de logique complexe. Jusqu'au dernier, il faut se consacrer au rôle de traitement de bundling.
Motif de façade https://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
Source du code (modifié en fonction de cela) https://www.techscore.com/tech/DesignPattern/Facade.html/
Recommended Posts