Шаблон Фасада – это один из структурных шаблонов проектирования (таких как шаблон адаптера и шаблон декоратора). Шаблон Фасада используется для облегчения взаимодействия клиентских приложений с системой.
Шаблон Фасада
Согласно 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