Gevelontwerppatroon in Java

Façade Ontwerppatroon is een van de Structurele ontwerppatronen (zoals het Adapter-patroon en het Decorator-patroon). Het Façade-ontwerppatroon wordt gebruikt om clienttoepassingen te helpen gemakkelijk te communiceren met het systeem.

Façade Ontwerppatroon

Volgens GoF is het Façade-ontwerppatroon als volgt:

Biedt een verenigde interface voor een set interfaces in een subsysteem. Het Façade-patroon definieert een hoger niveau van interface waardoor het subsysteem eenvoudiger te gebruiken is.

Stel dat we een applicatie hebben met een set interfaces om een MySql/Oracle-database te gebruiken en verschillende soorten rapporten te genereren, zoals een HTML-rapport, PDF-rapport, enz. We zullen dus een verschillende set interfaces hebben om met verschillende soorten databases te werken. Wanneer de complexiteit toeneemt of de namen van de interfacegedragingen verwarrend zijn, kan de clienttoepassing het moeilijk vinden om hiermee om te gaan. Daarom kunnen we hier het Facade-ontwerppatroon toepassen en een omhullende interface bovenop de bestaande interface bieden om de clienttoepassing te helpen.

Facade Design Pattern – Set van Interfaces

We kunnen twee hulpprogramma-interfaces hebben, namelijk MySqlHelper en OracleHelper.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		// verkrijg MySql DB-verbinding met verbindingsparameters
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		// verkrijg gegevens uit tabel en genereer PDF-rapport
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		// verkrijg gegevens uit tabel en genereer PDF-rapport
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		// verkrijg Oracle DB-verbinding met verbindingsparameters
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		// verkrijg gegevens uit tabel en genereer PDF-rapport
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		// verkrijg gegevens uit tabel en genereer PDF-rapport
	}
	
}

Façade Ontwerppatroon Interface

We kunnen een façadepatrooninterface maken zoals hieronder. Let op het gebruik van Java Enum voor typeveiligheid.

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

Façade Ontwerppatroon Clientprogramma

Laten we nu de clientcode zien zonder het Façade-patroon te gebruiken en met behulp van de Façade-patrooninterface.

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";
		
		// genereren van MySql HTML-rapport en Oracle PDF-rapport zonder het Façade-patroon te gebruiken
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		// genereren van MySql HTML-rapport en Oracle PDF-rapport met behulp van Façade
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

Zoals u kunt zien, is het gebruik van de Façade-patrooninterface een veel eenvoudigere en schonere manier om te voorkomen dat er veel logica aan de clientzijde wordt toegevoegd. De JDBC Driver Manager-klasse om de databaseverbinding te krijgen is een prachtig voorbeeld van het façade-ontwerppatroon.

Belangrijke punten van het Façade Ontwerppatroon

  • Gevelontwerppatroon lijkt meer op een hulpmiddel voor clienttoepassingen; het verbergt de subsysteeminterfaces niet voor de client. Of je Facade moet gebruiken of niet, is volledig afhankelijk van de clientcode.
  • Gevelontwerppatroon kan op elk moment tijdens de ontwikkeling worden toegepast, meestal wanneer het aantal interfaces toeneemt en het systeem complexer wordt.
  • Subsysteeminterfaces zijn niet op de hoogte van de Facade en ze zouden geen verwijzing naar de Facade-interface moeten hebben.
  • Gevelontwerppatroon moet worden toegepast voor vergelijkbare soorten interfaces; het doel is om één interface te bieden in plaats van meerdere interfaces die vergelijkbare taken uitvoeren.
  • We kunnen het Factory-patroon met Facade gebruiken om een betere interface voor clientsystemen te bieden.

Dat is alles voor het Gevelontwerppatroon, blijf op de hoogte voor meer artikelen over ontwerppatronen. 🙂

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