Erklären Sie kurz, wofür das Fassadenmuster nützlich ist (mit Code).
Einfach ausgedrückt, ** ein Koordinator für mehrere Prozesse **. Daher ist es nützlich, dass mit einer Anforderung verschiedene Aufgaben ausgeführt werden können.
Quelle: Wiki - Fassadenmuster
Unter dem Gesichtspunkt, dass Librarian über BookList und LendingList verfügt, handelt es sich um eine Spezifikation, und es gibt keine Änderung in der Implementierung selbst, diese als Fenster zu verwenden.
Fassade: Bibliothekar Klasse Subsystem: BookList-Klasse, LendingList-Klasse Kunde: Besucherklasse
Librarian.java
package facade;
//Bibliothekar
public class Librarian {
private BookList _bookList;
private LendingList _lendingList;
Librarian(BookList bookList, LendingList lendingList){
_bookList = bookList;
_lendingList = lendingList;
}
public String searchBook(String bookName) {
//Ist es im Besitz?
if(!_bookList.existsBook(bookName)) return "Das Buch ist nicht im Besitz";
//Ist es im Bücherregal?
if (_lendingList.isLending(bookName)) return "Ausleihe";
//Sammelort
return _bookList.searchLocation(bookName);
}
}
BookList.java
package facade;
import java.util.HashMap;
import java.util.Map;
//Sammlungsbuch
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;
//Leihbuch
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) {
//Anfangswert eingestellt
// (Sammlungsliste)
BookList bookList = new BookList();
bookList.addRecord("Bilderbuch für Insekten", "Regal Nummer 1");
bookList.addRecord("Tierbilderbuch", "Regal Nummer 1");
bookList.addRecord("Momotaro", "Regal Nummer 2");
bookList.addRecord("Kintaro", "Regal Nummer 2");
bookList.addRecord("Wie der Computer funktioniert", "Regal Nummer 3");
bookList.addRecord("Java-Programmierung", "Regal Nummer 3");
// (Leihliste)
LendingList lendingList = new LendingList();
lendingList.lending("Bilderbuch für Insekten");
lendingList.lending("Momotaro");
lendingList.lending("Wie der Computer funktioniert");
PrintStream out = System.out;
//Nutzer[Yamada-Kun]:Bibliothekar[Nakamura-Kun]Auf Anfrage
Visitor yamada = new Visitor("Yamada");
yamada.setTargetBookName("Bilderbuch für Insekten");
// (Fenster[Nakamura-Kun])
Librarian nakamura = new Librarian(bookList, lendingList);
// (Fragen Sie Nakamura-kun nach dem Standort des Insekten-Bilderbuchs)
out.println(yamada.name() + "Ergebnis:");
out.println(nakamura.searchBook(yamada.targetBookName()));
out.println();
//Nutzer[Kinoshita-Kun]: Wenn Sie selbst suchen
Visitor kinoshita = new Visitor("Kinoshita");
kinoshita.setTargetBookName("Tierbilderbuch");
if(!bookList.existsBook(kinoshita.targetBookName())) {
out.println("Lass uns ein anderes Buch machen");
return;
}
if(lendingList.isLending(kinoshita.targetBookName())) {
out.println("Lass uns ein anderes Buch machen");
return;
}
out.println(kinoshita.name() + "Ergebnis:");
out.println(bookList.searchLocation(kinoshita.targetBookName()));
out.println();
}
}
Bitte ändern Sie den Zielbuchnamen von Yamada-kun und Kinoshita-kun und überprüfen Sie den Vorgang.
Github https://github.com/TakumiKondo/designpattern/tree/master/src/facade/librarian
Sobald Sie eine Reihe von Codes schreiben, die mehrere Prozesse an verschiedenen Stellen aufrufen, Erwägen Sie die Verwendung des Fassadenmusters.
Wie die Anforderung besagt, sollte sie jedoch keine komplexe Logik enthalten. Bis zuletzt ist es erforderlich, sich der Rolle der Bündelungsverarbeitung zu widmen.
Fassadenmuster https://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
Codequelle (basierend darauf geändert) https://www.techscore.com/tech/DesignPattern/Facade.html/
Recommended Posts