Шаблон проектирования фасадов - это один из подтипов шаблона проектирования конструкций. Он используется для того, чтобы предоставить клиенту минимальную реализацию, причем в простой и понятной для него форме.
Фасад предоставляет интерфейс, который клиент может использовать для доступа к системе. За интерфейсом можно скрыть сложности бизнес-логики.
Давайте сразу же посмотрим, как мы можем реализовать шаблон проектирования фасадов:
Рассмотрим требование, при котором мы должны генерировать разные отчеты, и данные для этих отчетов хранятся в разных ORM, таких как MYSQL и DB2. Итак, здесь при создании отчета нам нужно сначала установить соединение и получить данные из БД. Как только данные будут заполнены, мы можем отправить данные методу, который генерирует отчет.
Здесь мы создадим интерфейс и определим общие методы, которые можно использовать повсюду.
public interface Reports { public void getDataForReports(String reportType); public void generateReport(); }
Мы будем рассматривать два типа отчетов: отчет по клиенту и отчет по заказам. Класс CustomerReport можно определить следующим образом.
public class CustomerReport implements Reports { @Override public void getDataForReports(String reportType) { // BusinessLogic for getting the data for Customer Report } @Override public void generateReport() { // Business Logic for generating report; } }
И OrdersReport будет определяться следующим образом.
public class OrderReports implements Reports{ @Override public void getDataForReports(String reportType) { // BusinessLogic for getting the data for Customer Report } @Override public void generateReport() { // Business Logic for generating report; } }
Теперь появится класс ReportsGenerator, который будет выступать в роли фасада. Этот класс скрывал бы фактическую реализацию выборки данных и создания отчета.
public class ReportsGenerator { public static String generateReport(String reportType) { switch(reportType) { case "Customer": Reports customerReport = new CustomerReport(); customerReport.getDataForReports(reportType); customerReport.generateReport(); return reportType + "generated successfully!"; case "OrderReport": Reports orderReport = new OrderReports(); orderReport.getDataForReports(reportType); orderReport.generateReport(); return reportType + "generated successfully!"; } return "Invalid Report Type, Please select the correct one!"; } }
Теперь давайте спроектируем класс ApiHandler, который будет вызывать метод generateReport()
класса ReportsGenerator.
public class ApiHandler { public static void main(String[] args) { System.out.println(ReportsGenerator.generateReport("Customer")); System.out.println(ReportsGenerator.generateReport("Order")); } }
Когда использовать шаблон проектирования фасадов?
Фасад следует использовать, когда у нас есть сложная бизнес-логика и мы должны предоставить клиенту только упрощенный API.
Преимущества дизайна фасада:
- Мы можем отделить сложную системную логику от клиентов.
- Обертка сложной системной логики достигается с помощью паттерна «Дизайн фасада».
Недостатки паттерна оформления фасада:
- Класс Facade в конечном итоге может стать суперклассом.
- Дополнительный уровень абстракции добавляется благодаря Фасаду.