Modello di Progettazione Facade in Java

Modello di progettazione della facciata è uno dei modelli di progettazione strutturale (come il modello dell’adattatore e il modello del decoratore). Il modello di progettazione della facciata viene utilizzato per aiutare le applicazioni client a interagire facilmente con il sistema.

Modello di progettazione della facciata

Secondo GoF, il modello di progettazione della facciata è:

Fornire un’interfaccia unificata a un insieme di interfacce in un sottosistema. Il modello di progettazione della facciata definisce un’interfaccia di livello superiore che rende il sottosistema più facile da utilizzare.

Supponiamo di avere un’applicazione con un insieme di interfacce per utilizzare il database MySql/Oracle e generare diversi tipi di report, come report HTML, report PDF, ecc. Quindi avremo un diverso insieme di interfacce per lavorare con diversi tipi di database. Ora un’applicazione client può utilizzare queste interfacce per ottenere la connessione al database richiesta e generare i report. Ma quando aumenta la complessità o i nomi dei comportamenti delle interfacce sono confusionari, l’applicazione client troverà difficile gestirlo. Quindi possiamo applicare il pattern di progettazione Facade qui e fornire un’interfaccia di incapsulamento sopra l’interfaccia esistente per aiutare l’applicazione client.

Pattern di progettazione Facade – Insieme di interfacce

Possiamo avere due interfacce di supporto, chiamate MySqlHelper e OracleHelper.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//ottenere la connessione al database MySql utilizzando i parametri di connessione
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//ottenere i dati dalla tabella e generare un report PDF
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//ottenere i dati dalla tabella e generare un report PDF
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//ottenere la connessione al database Oracle utilizzando i parametri di connessione
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//ottenere i dati dalla tabella e generare un report PDF
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//ottenere i dati dalla tabella e generare un report PDF
	}
	
}

Interfaccia del Modello di Progettazione della Facciata

Possiamo creare un’interfaccia del modello di progettazione della facciata come segue. Notare l’uso di Java Enum per la sicurezza del tipo.

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;
	}
}

Programma Client del Modello di Progettazione della Facciata

Ora vediamo il codice client senza utilizzare il modello di progettazione della facciata e utilizzando l’interfaccia del modello di progettazione della facciata.

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";
		
		// generazione del report HTML di MySql e del report PDF di Oracle senza utilizzare la Facciata
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		// generazione del report HTML di MySql e del report PDF di Oracle utilizzando la Facciata
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

Come puoi vedere, l’utilizzo dell’interfaccia del modello di progettazione della facciata è un modo molto più semplice e pulito per evitare di avere molta logica sul lato client. La classe JDBC Driver Manager per ottenere la connessione al database è un meraviglioso esempio di modello di progettazione della facciata.

Punti Importanti del Modello di Progettazione della Facciata

  • Modello di progettazione della facciata è più simile a un assistente per le applicazioni client, non nasconde le interfacce del sottosistema dal client. La decisione di utilizzare o meno la facciata dipende completamente dal codice client.
  • Il modello di progettazione della facciata può essere applicato in qualsiasi momento dello sviluppo, di solito quando il numero di interfacce cresce e il sistema diventa complesso.
  • Le interfacce del sottosistema non sono consapevoli della facciata e non dovrebbero fare riferimento all’interfaccia della facciata.
  • Il modello di progettazione della facciata dovrebbe essere applicato per interfacce simili, il suo scopo è fornire un’interfaccia singola anziché multiple interfacce che svolgono lavori simili.
  • Possiamo utilizzare il modello di progettazione Factory con la facciata per fornire un’interfaccia migliore ai sistemi client.

E questo è tutto per il modello di progettazione della facciata, rimanete sintonizzati per ulteriori articoli sui modelli di progettazione. 🙂

Source:
https://www.digitalocean.com/community/tutorials/facade-design-pattern-in-java