Паттерн проектирования фасад в Java

Шаблон Фасада – это один из структурных шаблонов проектирования (таких как шаблон адаптера и шаблон декоратора). Шаблон Фасада используется для облегчения взаимодействия клиентских приложений с системой.

Шаблон Фасада

Согласно GoF, шаблон Фасада – это:

Предоставление единого интерфейса для набора интерфейсов в подсистеме. Шаблон Фасада определяет интерфейс более высокого уровня, что делает подсистему проще в использовании.

Предположим, у нас есть приложение с набором интерфейсов для использования базы данных MySql/Oracle и создания различных типов отчетов, таких как отчет в формате HTML, отчет в формате PDF и так далее. Таким образом, у нас будет различный набор интерфейсов для работы с разными типами баз данных. Когда клиентское приложение использует эти интерфейсы для получения необходимого подключения к базе данных и создания отчетов, все хорошо. Однако, с увеличением сложности или неудачными именами интерфейсов клиентское приложение может столкнуться с трудностями в управлении этим. Поэтому здесь мы можем применить шаблон проектирования Facade и предоставить обертку интерфейса поверх существующего интерфейса, чтобы помочь клиентскому приложению.

Шаблон проектирования Facade – Набор интерфейсов

Мы можем иметь два вспомогательных интерфейса, а именно MySqlHelper и OracleHelper.

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//получить соединение с базой данных MySql, используя параметры подключения
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//получить данные из таблицы и создать отчет в формате pdf
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//получить данные из таблицы и создать отчет в формате pdf
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//получить соединение с базой данных Oracle, используя параметры подключения
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//получить данные из таблицы и создать отчет в формате pdf
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//получить данные из таблицы и создать отчет в формате pdf
	}
	
}

Шаблон проектирования интерфейса фасада

Мы можем создать интерфейс шаблона фасада следующим образом. Обратите внимание на использование перечисления Java для обеспечения типовой безопасности.

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

Клиентская программа шаблона проектирования фасада

Теперь давайте рассмотрим код клиента без использования шаблона фасада и с использованием интерфейса шаблона фасада.

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";
		
		// генерация отчета HTML для MySql и отчета PDF для Oracle без использования фасада
		Connection con = MySqlHelper.getMySqlDBConnection();
		MySqlHelper mySqlHelper = new MySqlHelper();
		mySqlHelper.generateMySqlHTMLReport(tableName, con);
		
		Connection con1 = OracleHelper.getOracleDBConnection();
		OracleHelper oracleHelper = new OracleHelper();
		oracleHelper.generateOraclePDFReport(tableName, con1);
		
		// генерация отчета HTML для MySql и отчета PDF для Oracle с использованием фасада
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

Как видно, использование интерфейса шаблона фасада – намного более простой и чистый способ избежать большого объема логики на стороне клиента. Класс JDBC Driver Manager для получения подключения к базе данных – прекрасный пример шаблона проектирования фасада.

Важные моменты шаблона проектирования фасада

  • Шаблон проектирования фасада больше похож на помощника для клиентских приложений, он не скрывает интерфейсы подсистемы от клиента. Решение о том, использовать фасад или нет, полностью зависит от кода клиента.
  • Шаблон проектирования фасада можно применять на любом этапе разработки, обычно когда количество интерфейсов растет и система становится сложной.
  • Интерфейсы подсистемы не знают о фасаде и не должны иметь ссылку на интерфейс фасада.
  • Шаблон проектирования фасада должен применяться для аналогичных типов интерфейсов, его цель – предоставить один интерфейс вместо нескольких интерфейсов, выполняющих аналогичную работу.
  • Мы можем использовать шаблон фабрики с фасадом, чтобы предоставить лучший интерфейс для клиентских систем.

Вот и все, что касается шаблона проектирования фасада. Следите за новыми статьями о шаблонах проектирования. 🙂

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