Шаблон проектирования фасадов - это один из подтипов шаблона проектирования конструкций. Он используется для того, чтобы предоставить клиенту минимальную реализацию, причем в простой и понятной для него форме.

Фасад предоставляет интерфейс, который клиент может использовать для доступа к системе. За интерфейсом можно скрыть сложности бизнес-логики.

Давайте сразу же посмотрим, как мы можем реализовать шаблон проектирования фасадов:

Рассмотрим требование, при котором мы должны генерировать разные отчеты, и данные для этих отчетов хранятся в разных 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 в конечном итоге может стать суперклассом.
  • Дополнительный уровень абстракции добавляется благодаря Фасаду.