Шаблон проектирования фасада в 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, чтобы обеспечить лучший интерфейс для клиентских систем.
Это все, что касается шаблона проектирования «Фасад», следите за новостями о других шаблонах проектирования. :)