环绕模式未在GOF书中列出,但对于以下问题非常有用:
- 循环构造,例如执行while / while / for循环
- 秒表周围的一些代码。
- 用运行时异常包装检查的异常
- 初始化和清理,例如创建/销毁线程池或打开/关闭文件等
- 将上下文信息添加到线程,例如请求上下文信息以记录或传递安全上下文等
Java需要大量的管道代码来完成这些简单的事情。 Java8添加了对lamdba的支持,并且可以解决此类问题。
可以将Lambda行为作为参数传递给任何函数,如果要解决上述问题,这是非常强大的事情。
环绕
环绕功能的模板如下所示
- 预编码
- 实际行为
- 邮编
WrapAround for循环
@FunctionalInterfacepublic interface CodeBlock {void execute();}@FunctionalInterfacepublic interface Condition {boolean test();}public static void loop(Condition condition, CodeBlock codeBlock) {while (condition.test()) {codeBlock.execute();}}
上面的代码非常简单,它具有2个功能接口,一个用于条件,另一个用于执行代码块,并且这2个行为使用lambda传递给循环函数。
这使我们可以引入新的构造。
让我们看一些更多的例子
WrapAround时间/秒表
@FunctionalInterfacepublic 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可关闭/异常
@FunctionalInterfacepublic interface AutoCodeBlock {void execute(AutoCloseable closeable) throws IOException;}@FunctionalInterfacepublic 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获得
翻译自: https://www.javacodegeeks.com/2015/10/wrap-around-design-pattern-in-java8.html