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