Поиск по сайту:

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


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

Шаблон оформления фасада

Обеспечить унифицированный интерфейс для набора интерфейсов в подсистеме. Facade Pattern определяет высокоуровневый интерфейс, упрощающий использование подсистемы.

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

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

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

package com.journaldev.design.facade;

import java.sql.Connection;

public class MySqlHelper {
	
	public static Connection getMySqlDBConnection(){
		//get MySql DB connection using connection parameters
		return null;
	}
	
	public void generateMySqlPDFReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
	public void generateMySqlHTMLReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
}
package com.journaldev.design.facade;

import java.sql.Connection;

public class OracleHelper {

	public static Connection getOracleDBConnection(){
		//get Oracle DB connection using connection parameters
		return null;
	}
	
	public void generateOraclePDFReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
	public void generateOracleHTMLReport(String tableName, Connection con){
		//get data from table and generate pdf report
	}
	
}

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

Мы можем создать интерфейс шаблона фасада, как показано ниже. Обратите внимание на использование Java Enum для безопасности типов.

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

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

Теперь давайте посмотрим на клиентский код без использования паттерна Facade и с использованием интерфейса паттерна 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";
		
		//generating MySql HTML report and Oracle PDF report without using 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);
		
		//generating MySql HTML report and Oracle PDF report using Facade
		HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
		HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
	}

}

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

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

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

Это все, что касается шаблона проектирования «Фасад», следите за новостями о других шаблонах проектирования. :)