Шаблон обтекания не указан в книге GOF, но очень полезен для решения проблем, подобных приведенным ниже:
- Циклическая конструкция, например, для цикла do while / while / for
- Секундомер вокруг некоторого кода.
- Обернуть проверенное исключение с исключением во время выполнения
- Инициализация и очистка, например, создание / уничтожение Threadpool или открытие / закрытие файла и т. Д.
- Добавление контекстной информации в потоки, например, запрос контекстной информации для регистрации или передачи контекста безопасности и т. Д.
Для выполнения таких простых вещей в Java требуется много кода. Java8 добавил поддержку lamdba, и у этого есть ответ для таких проблем.
Использование лямбда-поведения может быть передано в качестве аргумента любой функции, и это очень мощная вещь, если вы хотите решить вышеуказанные проблемы.
Обернуть вокруг
Шаблон функции обтекания выглядит примерно так
- Предварительный код
- Фактическое поведение
- Почтовый индекс
WrapAround для цикла
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
@FunctionalInterface public interface CodeBlock { void execute(); } @FunctionalInterface public interface Condition { boolean test(); } public static void loop(Condition condition, CodeBlock codeBlock) { while (condition.test()) { codeBlock.execute(); } } |
Выше код очень прост, он имеет 2 функциональных интерфейса, один для условия и другой для блока кода, который нужно выполнить, и эти два поведения передаются в функцию цикла с помощью лямбда-выражения.
Это позволяет нам вводить новую конструкцию.
Давайте посмотрим на еще один пример
WrapAround для времени / секундомер
01
02
03
04
05
06
07
08
09
10
11
|
@FunctionalInterface public interface CodeBlock { void execute(); } public static void time(String name, CodeBlock codeBlock) { long start = System.currentTimeMillis(); codeBlock.execute(); long total = System.currentTimeMillis() - start; System.out.println(name + " took " + total + " ms" ); } |
WrapAround Closable / Исключение
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@FunctionalInterface public interface AutoCodeBlock { void execute(AutoCloseable closeable) throws IOException; } @FunctionalInterface public interface ExceptionBlock { void execute() throws Exception; } public static void withAutoClose(AutoCloseable resource, AutoCodeBlock codeBlock) throws Exception { try (AutoCloseable c = resource) { codeBlock.execute(c); } } public static void wrapWithRuntimeException(ExceptionBlock codeBlock) { try { codeBlock.execute(); } catch (Exception e) { throw new RuntimeException(e); } } |
Java 8 имеет множество функций, которые могут сделать код кратким, и я использовал только одну функцию, которая реализует действительно полезную вещь.
- Код, используемый в блоге доступен @ github
Ссылка: | Оберните вокруг шаблон дизайна в java8 от нашего партнера JCG Ашкрит Шарма в блоге Готовы . |