Автор оригинала: 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 для подключения к базе данных является прекрасным примером шаблона проектирования фасада.
Важные Моменты Дизайна Фасада
- Шаблон дизайна фасада больше похож на помощник для клиентских приложений, он не скрывает интерфейсы подсистем от клиента. Использование фасада или нет полностью зависит от клиентского кода.
- Шаблон дизайна фасада может быть применен на любом этапе разработки, обычно, когда количество интерфейсов растет и система усложняется.
- Интерфейсы подсистем не знают о фасаде и не должны иметь никаких ссылок на интерфейс фасада.
- Шаблон дизайна фасада следует применять для аналогичных интерфейсов, его цель состоит в том, чтобы обеспечить единый интерфейс, а не несколько интерфейсов, которые выполняют аналогичные задачи.
- Мы можем использовать Заводской шаблон с фасадом, чтобы обеспечить лучший интерфейс для клиентских систем.
Это все для шаблона дизайна фасада, следите за обновлениями для получения дополнительных статей о шаблонах дизайна. 🙂