Padrão de Design de Fachada em Java

Padrão de Design de Fachada é um dos padrões de design estruturais (como o padrão Adaptador e o padrão Decorador). O padrão de design de fachada é usado para ajudar as aplicações cliente a interagirem facilmente com o sistema.

Padrão de Design de Fachada

De acordo com o GoF, o padrão de design de fachada é:

Fornecer uma interface unificada para um conjunto de interfaces em um subsistema. O padrão de design de fachada define uma interface de nível superior que torna o subsistema mais fácil de usar.

Suponha que tenhamos uma aplicação com um conjunto de interfaces para usar o banco de dados MySql/Oracle e para gerar diferentes tipos de relatórios, como relatório HTML, relatório PDF etc. Portanto, teremos diferentes conjuntos de interfaces para trabalhar com diferentes tipos de banco de dados. Agora, uma aplicação cliente pode usar essas interfaces para obter a conexão de banco de dados necessária e gerar relatórios. Mas quando a complexidade aumenta ou os nomes dos comportamentos da interface são confusos, a aplicação cliente terá dificuldade em gerenciá-la. Então podemos aplicar o padrão de design Facade aqui e fornecer uma interface de envoltório sobre a interface existente para ajudar a aplicação cliente.

Padrão de Design Facade – Conjunto de Interfaces

Podemos ter duas interfaces auxiliares, nomeadamente MySqlHelper e OracleHelper.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//obter conexão do banco de dados MySql usando parâmetros de conexão
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//obter dados da tabela e gerar relatório pdf
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//obter dados da tabela e gerar relatório pdf
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//obter conexão do banco de dados Oracle usando parâmetros de conexão
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//obter dados da tabela e gerar relatório pdf
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//obter dados da tabela e gerar relatório pdf
	}
	
}

Interface do Padrão de Design Facade

Podemos criar uma interface de padrão Facade como abaixo. Observe o uso de Enum Java para segurança de 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;
	}
}

Programa Cliente do Padrão de Design Facade

Agora vamos ver o código do cliente sem usar o padrão Facade e usando a interface do padrão Facade.

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";
		
		//gerando relatório HTML do MySql e relatório PDF do Oracle sem usar Facade
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		//gerando relatório HTML do MySql e relatório PDF do Oracle usando Facade
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

Como você pode ver, usar a interface do padrão Facade é uma maneira muito mais fácil e limpa de evitar ter muita lógica no lado do cliente. A classe JDBC Driver Manager para obter a conexão com o banco de dados é um exemplo maravilhoso do padrão de design Facade.

Pontos Importantes do Padrão de Design Facade

  • O padrão de design de fachada é mais como um auxiliar para aplicações de cliente, ele não esconde as interfaces do subsistema do cliente. Se usar a fachada ou não depende completamente do código do cliente.
  • O padrão de design de fachada pode ser aplicado em qualquer momento do desenvolvimento, geralmente quando o número de interfaces aumenta e o sistema fica mais complexo.
  • As interfaces do subsistema não estão cientes da fachada e não devem ter nenhuma referência da interface da fachada.
  • O padrão de design de fachada deve ser aplicado para interfaces semelhantes, seu objetivo é fornecer uma única interface em vez de múltiplas interfaces que realizam trabalhos semelhantes.
  • Podemos usar o padrão de fábrica com a fachada para fornecer uma melhor interface para sistemas de cliente.

Isso é tudo para o padrão de design de fachada, fique ligado para mais artigos sobre padrões de design. 🙂

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