Fassadenentwurfsmuster ist eines der Strukturellen Entwurfsmuster (wie Adaptermuster und Dekorierermuster). Das Fassadenentwurfsmuster wird verwendet, um Clientanwendungen dabei zu helfen, einfach mit dem System zu interagieren.
Fassadenentwurfsmuster
Laut GoF besteht das Fassadenentwurfsmuster darin:
Eine einheitliche Schnittstelle für eine Reihe von Schnittstellen in einem Teilsystem bereitzustellen. Das Fassadenmuster definiert eine höhere Schnittstelle, die das Teilsystem einfacher zu verwenden macht.
Angenommen, wir haben eine Anwendung mit einer Reihe von Schnittstellen zur Verwendung der MySql/Oracle-Datenbank und zur Erzeugung verschiedener Arten von Berichten, wie HTML-Bericht, PDF-Bericht usw. Daher haben wir verschiedene Schnittstellensätze, um mit verschiedenen Arten von Datenbanken zu arbeiten. Jetzt kann eine Client-Anwendung diese Schnittstellen verwenden, um die benötigte Datenbankverbindung zu erhalten und Berichte zu generieren. Aber wenn die Komplexität zunimmt oder die Benennung des Verhaltens der Schnittstellen verwirrend ist, wird es für die Client-Anwendung schwierig, dies zu verwalten. Daher können wir hier das Fassaden-Designmuster anwenden und eine Wrapper-Schnittstelle über der bestehenden Schnittstelle bereitstellen, um der Client-Anwendung zu helfen.
Fassaden-Designmuster – Satz von Schnittstellen
Wir können zwei Hilfsschnittstellen haben, nämlich MySqlHelper
und OracleHelper
.
package com.journaldev.design.facade;
import java.sql.Connection;
public class MySqlHelper {
public static Connection getMySqlDBConnection(){
// MySql DB-Verbindung mit Verbindungsparametern erhalten
return null;
}
public void generateMySqlPDFReport(String tableName, Connection con){
// Daten aus Tabelle holen und PDF-Bericht generieren
}
public void generateMySqlHTMLReport(String tableName, Connection con){
// Daten aus Tabelle holen und PDF-Bericht generieren
}
}
package com.journaldev.design.facade;
import java.sql.Connection;
public class OracleHelper {
public static Connection getOracleDBConnection(){
// Oracle DB-Verbindung mit Verbindungsparametern erhalten
return null;
}
public void generateOraclePDFReport(String tableName, Connection con){
// Daten aus Tabelle holen und PDF-Bericht generieren
}
public void generateOracleHTMLReport(String tableName, Connection con){
// Daten aus Tabelle holen und PDF-Bericht generieren
}
}
Fassadenentwurfsmuster-Schnittstelle
Wir können eine Fassadenmuster-Schnittstelle wie unten erstellen. Beachten Sie die Verwendung von Java Enum für die Typsicherheit.
package com.journaldev.design.facade;
import java.sql.Connection;
public class HelperFacade {
public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){
Connection con = null;
switch (dbType){
case MYSQL:
con = MySqlHelper.getMySqlDBConnection();
MySqlHelper mySqlHelper = new MySqlHelper();
switch(reportType){
case HTML:
mySqlHelper.generateMySqlHTMLReport(tableName, con);
break;
case PDF:
mySqlHelper.generateMySqlPDFReport(tableName, con);
break;
}
break;
case ORACLE:
con = OracleHelper.getOracleDBConnection();
OracleHelper oracleHelper = new OracleHelper();
switch(reportType){
case HTML:
oracleHelper.generateOracleHTMLReport(tableName, con);
break;
case PDF:
oracleHelper.generateOraclePDFReport(tableName, con);
break;
}
break;
}
}
public static enum DBTypes{
MYSQL,ORACLE;
}
public static enum ReportTypes{
HTML,PDF;
}
}
Fassadenentwurfsmuster-Client-Programm
Jetzt sehen wir uns den Client-Code an, ohne das Fassadenmuster zu verwenden, und mit Verwendung der Fassadenmusterschnittstelle.
package com.journaldev.design.test;
import java.sql.Connection;
import com.journaldev.design.facade.HelperFacade;
import com.journaldev.design.facade.MySqlHelper;
import com.journaldev.design.facade.OracleHelper;
public class FacadePatternTest {
public static void main(String[] args) {
String tableName="Employee";
// Generierung des MySql HTML-Berichts und des Oracle PDF-Berichts ohne Verwendung der Fassade
Connection con = MySqlHelper.getMySqlDBConnection();
MySqlHelper mySqlHelper = new MySqlHelper();
mySqlHelper.generateMySqlHTMLReport(tableName, con);
Connection con1 = OracleHelper.getOracleDBConnection();
OracleHelper oracleHelper = new OracleHelper();
oracleHelper.generateOraclePDFReport(tableName, con1);
// Generierung des MySql HTML-Berichts und des Oracle PDF-Berichts unter Verwendung der Fassade
HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
}
}
Wie Sie sehen können, ist die Verwendung der Fassadenmusterschnittstelle eine viel einfachere und sauberere Möglichkeit, viel Logik auf der Clientseite zu vermeiden. Die Klasse JDBC DriverManager zur Erlangung der Datenbankverbindung ist ein wunderbares Beispiel für das Fassadenentwurfsmuster.
Fassadenentwurfsmuster Wichtige Punkte
- Fassadenentwurfsmuster ist eher wie ein Helfer für Clientanwendungen, es verbirgt die Subsystem-Schnittstellen nicht vor dem Client. Ob Facade verwendet wird oder nicht, hängt vollständig vom Clientcode ab.
- Das Fassadenentwurfsmuster kann zu jedem Zeitpunkt der Entwicklung angewendet werden, normalerweise wenn die Anzahl der Schnittstellen wächst und das System komplex wird.
- Subsystem-Schnittstellen sind sich der Fassade nicht bewusst und sollten keine Referenz der Fassadenschnittstelle haben.
- Das Fassadenentwurfsmuster sollte für ähnliche Arten von Schnittstellen angewendet werden, sein Zweck ist es, eine einzige Schnittstelle anstelle mehrerer Schnittstellen bereitzustellen, die ähnliche Arten von Aufgaben erledigen.
- Wir können das Factory-Muster mit der Fassade verwenden, um bessere Schnittstellen für Clientsysteme bereitzustellen.
Das ist alles zum Fassadenentwurfsmuster, bleiben Sie dran für weitere Designmusterartikel. 🙂
Source:
https://www.digitalocean.com/community/tutorials/facade-design-pattern-in-java