Padrão de Projeto Facade em Java

O Padrão de Design de Fachada é um dos padrões de design estrutural (como o padrão Adaptador e o padrão Decorador). O padrão de design de fachada é usado para ajudar as aplicações clientes a interagir 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 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 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 do comportamento da interface são confusos, a aplicação cliente encontrará dificuldades para gerenciá-la. Portanto, podemos aplicar o padrão de design Facade aqui e fornecer uma interface invólucro 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 MySql DB 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 Oracle DB 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 Projeto Fachada

Podemos criar uma interface de padrão de fachada 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 Projeto Fachada

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

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 a fachada
		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 a fachada
		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 de fachada é 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 projeto de fachada.

Pontos Importantes do Padrão de Projeto Fachada

  • Padrão de design de fachada é mais como um auxiliar para aplicações do cliente, não esconde interfaces do subsistema do cliente. A decisão de usar ou não a fachada depende inteiramente do código do cliente.
  • O padrão de design de fachada pode ser aplicado em qualquer ponto do desenvolvimento, geralmente quando o número de interfaces cresce e o sistema se torna 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 a interfaces semelhantes; seu propósito é fornecer uma única interface em vez de várias interfaces que realizam trabalhos semelhantes.
  • Pode-se usar o padrão de fábrica com a fachada para fornecer uma interface melhor para sistemas do 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