Автор оригинала: Pankaj Kumar.
Шаблон дизайна фасада является одним из Шаблонов структурного дизайна (таких как Шаблон адаптера и Шаблон декоратора ). Шаблон дизайна фасада используется для облегчения взаимодействия клиентских приложений с системой.
Шаблон Дизайна Фасада
В соответствии с рисунком дизайна фасада GoF:
Обеспечьте единый интерфейс для набора интерфейсов в подсистеме. Шаблон фасада определяет интерфейс более высокого уровня, который упрощает использование подсистемы.
Предположим, у нас есть приложение с набором интерфейсов для использования базы данных MySQL/Oracle и создания различных типов отчетов, таких как отчет HTML, отчет PDF и т.д.
Таким образом, у нас будет разный набор интерфейсов для работы с различными типами баз данных. Теперь клиентское приложение может использовать эти интерфейсы для получения необходимого подключения к базе данных и создания отчетов.
Но когда сложность возрастает или имена поведения интерфейса сбивают с толку, клиентскому приложению будет трудно управлять им.
Таким образом, мы можем применить здесь шаблон дизайна фасада и предоставить интерфейс оболочки поверх существующего интерфейса, чтобы помочь клиентскому приложению.
Шаблон дизайна фасада – Набор интерфейсов
У нас может быть два вспомогательных интерфейса, а именно 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 для обеспечения безопасности типов.
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";
//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);
}
}
Как вы можете видеть, использование интерфейса шаблона фасада – намного более простой и чистый способ избежать большого количества логики на стороне клиента. Класс диспетчера драйверов ODBC для подключения к базе данных является прекрасным примером шаблона проектирования фасада.
Важные Моменты Дизайна Фасада
- Шаблон дизайна фасада больше похож на помощник для клиентских приложений, он не скрывает интерфейсы подсистем от клиента. Использование фасада или нет полностью зависит от клиентского кода.
- Шаблон дизайна фасада может быть применен на любом этапе разработки, обычно, когда количество интерфейсов растет и система усложняется.
- Интерфейсы подсистем не знают о фасаде и не должны иметь никаких ссылок на интерфейс фасада.
- Шаблон дизайна фасада следует применять для аналогичных интерфейсов, его цель состоит в том, чтобы обеспечить единый интерфейс, а не несколько интерфейсов, которые выполняют аналогичные задачи.
- Мы можем использовать Заводской шаблон с фасадом, чтобы обеспечить лучший интерфейс для клиентских систем.
Это все для шаблона дизайна фасада, следите за обновлениями для получения дополнительных статей о шаблонах дизайна. 🙂