Статьи

Структурные Проектные Образцы: Фасадный Образец

Как разработчики большую часть времени нам приходится иметь дело со сложными системами, со многими зависимостями и даже с несуществующей документацией вообще.

В этих ситуациях очень важно найти способ решения этих проблем. Наиболее распространенный способ справиться с этим — это скрыть все эти зависимости и указать интерфейс на передней панели.

Шаблон для использования — это фасадный шаблон.

Каким-то образом вы получаете очень сложную систему, которая генерирует отчеты различными способами. Система генерирует отчеты в виде XML-файлов, CSV-файлов и даже создает отчеты из базы данных.
Отчет, сгенерированный в файлах xml, извлекает статистику на основе местоположения, отчет, сгенерированный в файлах csv, связан с данными временных рядов и отчетом базы данных о данных об использовании.

Описанные выше функции должны быть включены в веб-приложение.

Первым шагом будет создание некоторых интерфейсов на основе каждого отчета.
Первым интерфейсом будет отчет о геолокации. Указывая местоположение и расстояние, должен быть сформирован отчет с местоположениями в пределах расстояния, указанного от точки.

1
2
3
4
5
6
7
package com.gkatzioura.design.structural.facade;
 
public interface GeolocationReport {
 
     String[][] generate(Double lat,Double lng,Double distance);
 
}

Отчет Geolation будет основан на отчетах xml, созданных нашей системой. Таким образом, реализация будет основана на отчете xml.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.gkatzioura.design.structural.facade;
 
public class XMLGeolocationReport implements GeolocationReport {
 
    @Override
    public String[][] generate(Double lat, Double lng, Double distance) {
 
        /**
         * http requests to retrieve the xml
         * iterate the xml using stax
        */
 
        return new String[][]{};
    }
 
}

Наш следующий отчет будет связан с данными временных рядов. В качестве аргумента будут приведены две даты и, таким образом, будут получены необходимые данные.

1
2
3
4
5
6
7
8
9
package com.gkatzioura.design.structural.facade;
 
import java.util.Date;
 
public interface TimeSeriesReport {
 
    String[][] generate(Date start,Date end);
 
}

Поскольку отчет csv — это отчет, созданный с данными временных рядов, наша реализация будет основана на отчете csv нашей системы.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.gkatzioura.design.structural.facade;
 
import java.util.Date;
 
public class CSVTimeSeriesReport implements TimeSeriesReport {
 
    @Override
    public String[][] generate(Date start, Date end) {
 
        /**
         * retrieve the csv and iterate line by line within the time limits
         */
 
        return new String[][]{};
    }
}

Последний шаг — отчет об использовании пользователя. Должен быть указан uuid, представляющий пользователя.

1
2
3
4
5
6
7
8
9
package com.gkatzioura.design.structural.facade;
 
import java.util.UUID;
 
public interface UsageReport {
 
    String[][] report(UUID uuid);
 
}

Отчет об использовании будет основан на отчете базы данных.

01
02
03
04
05
06
07
08
09
10
11
12
package com.gkatzioura.design.structural.facade;
 
import java.util.UUID;
 
public class SQLUsageReport implements UsageReport {
 
    @Override
    public String[][] report(UUID uuid) {
        return new String[0][];
    }
 
}

До сих пор мы абстрагировали основные функциональные возможности нашей системы. Наш следующий шаг — создать фасад, который использует все эти функции и устраняет разрыв между потребностями нашего веб-приложения и системой, которая предоставляет информацию.
Например, основываясь на использовании пользователя, нам нужны данные, основанные на времени и местоположении пользователя.

01
02
03
04
05
06
07
08
09
10
package com.gkatzioura.design.structural.facade;
 
import java.util.Date;
import java.util.UUID;
 
public interface UserUsageFacade {
     
    String[][] usageOn(UUID user, Date from, Double lat,Double lng);
     
}

И реализация будет использовать реализации отчетов для создания отчета, который подходит нашему веб-приложению.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.gkatzioura.design.structural.facade;
 
import java.util.Date;
import java.util.UUID;
 
public class UserUsageFacadeImpl implements UserUsageFacade {
 
    private final GeolocationReport geolocationReport;
    private final TimeSeriesReport timeSeriesReport;
    private final UsageReport usageReport;
 
    private final double DEFAULT_DISTANCE = 20d;
    private final int DEFAULT_TIME_RANGE = 20;
 
    public UserUsageFacadeImpl(GeolocationReport geolocationReport, TimeSeriesReport timeSeriesReport, UsageReport usageReport) {
        this.geolocationReport = geolocationReport;
        this.timeSeriesReport = timeSeriesReport;
        this.usageReport = usageReport;
    }
 
    @Override
    public String[][] usageOn(UUID user, Date from, Double lat, Double lng) {
 
        String[][] locationData = geolocationReport.generate(lat,lng,DEFAULT_DISTANCE);
        Date to = Date.from(from.toInstant().plusSeconds(DEFAULT_TIME_RANGE));
        String[][] timeSetiesData = timeSeriesReport.generate(from,to);
        String[][] usageData = usageReport.report(user);
 
        /**
         * Generate the report based on the data retrieved
         */
 
        return new String[][] {};
    }
}

Вы можете найти исходный код на github .
Также вы можете найти несколько полезных статей по шаблону адаптера, шаблону декоратора , композитному шаблону и шаблону моста .

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. См. Оригинальную статью здесь: Структурные Проектные Образцы: Образец Фасада

Мнения, высказанные участниками Java Code Geeks, являются их собственными.