Flink 1.14 怎么实现策略模式+模版模式,消除if else,举例子 如 编写一个接口,接口方法包含一个support和execute方法,实现不同的策略
时间: 2024-03-27 09:40:36 浏览: 59
在 Flink 1.14 中,可以通过使用函数式编程的方式来实现策略模式和模板模式,消除 if else 的使用。
具体实现方式如下:
首先,我们定义一个接口 `Strategy`,它包含一个 `support` 方法和一个 `execute` 方法:
```java
public interface Strategy<T> {
boolean support(T input);
void execute(T input);
}
```
其中,`support` 方法用于判断该策略是否支持当前输入,`execute` 方法用于执行该策略。
接着,我们定义一个模板方法 `Template`,它包含一个 `execute` 方法和一个 `List<Strategy>`,用于存储所有可用的策略:
```java
public class Template<T> {
private List<Strategy<T>> strategies;
public Template(List<Strategy<T>> strategies) {
this.strategies = strategies;
}
public void execute(T input) {
strategies.stream()
.filter(strategy -> strategy.support(input))
.findFirst()
.ifPresent(strategy -> strategy.execute(input));
}
}
```
其中,`execute` 方法首先会遍历所有可用的策略,找到第一个支持当前输入的策略,然后执行该策略。
最后,我们可以定义具体的策略,例如:
```java
public class StringStartsWith implements Strategy<String> {
private String prefix;
public StringStartsWith(String prefix) {
this.prefix = prefix;
}
@Override
public boolean support(String input) {
return input.startsWith(prefix);
}
@Override
public void execute(String input) {
System.out.println("StringStartsWith: " + input);
}
}
```
这个策略用于匹配输入字符串是否以指定的前缀开头,如果是,则输出一条日志。
最终,我们可以通过以下方式来使用这些组件:
```java
List<Strategy<String>> strategies = Arrays.asList(
new StringStartsWith("hello"),
new StringStartsWith("world")
);
Template<String> template = new Template<>(strategies);
template.execute("hello, world");
```
这个例子中,我们定义了两个字符串开头匹配的策略,并将它们添加到了模板中。然后,我们执行模板的 `execute` 方法,并传入了一个包含了指定前缀的字符串,这个时候,只有第一个策略会被执行,并输出一条日志。
阅读全文