Как разработчики большую часть времени нам приходится иметь дело со сложными системами, со многими зависимостями и даже с несуществующей документацией вообще.
В этих ситуациях очень важно найти способ решения этих проблем. Наиболее распространенный способ справиться с этим — это скрыть все эти зависимости и указать интерфейс на передней панели.
Шаблон для использования — это фасадный шаблон.
Каким-то образом вы получаете очень сложную систему, которая генерирует отчеты различными способами. Система генерирует отчеты в виде 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, являются их собственными. |