我使用lambda表达式+函数来实现策略模式,我是否正确使用它?
public void deploy(WatcherConfig config) {
performOnWatch(config, a -> {
deployWatch(a);
return null;
});
}
public void delete(final WatcherConfig config) {
performOnWatch(config, a -> {
deleteWatch(a);
return null;
});
}
public void performOnWatch(WatcherConfig config, Function<WatchConfig, Void> function) {
for (WatchConfig watchConfig : config.getWatchConfigs()) {
List<WatchConfig> realConfigs = WatchUtils.parseWatchParameter(watchConfig);
for(WatchConfig realWatchConfig : realConfigs) {
function.apply(realWatchConfig);
}
}
}
答案 0 :(得分:5)
如果您实现performOnWatch
替换streamWatchConfigs
(可能会返回一个集合),则可以使用流简化getWatchConfigs
方法:
public void performOnWatch(WatcherConfig config, Consumer<WatchConfig> consumer) {
config.streamWatchConfigs()
.flatMap(WatchUtils::parseWatchParameters)
.forEach(consumer::accept);
}
performOnWatch(config, this::deployWatch);
performOnWatch(config, this::deleteWatch);
答案 1 :(得分:1)
似乎合法。我唯一要改变的是使用Consumer<WatchConfig>
而不是Function<WatchConfig, Void>
。它将简化方法签名和策略实施(策略中不需要return null
)。
此外,如果deleteWatch()
和deployWatch()
返回null,并且您将使用Consumer
代码,则可以将其重写为:
performOnWatch(config, this::deployWatch);
performOnWatch(config, this::deleteWatch);
答案 2 :(得分:1)
每当你使用“模式”这个词时,你就会陷入一个可怕的心灵洞。这就是为什么我希望这本模式书从未写过。不要再考虑模式。忘了他们的名字。根据您需要完成的工作以及语言为您提供哪些工具来解决问题,并将灵活性,代码的可读性和性能结合起来。模式是精神上的拐杖。如果您足够聪明以正确使用模式,则不需要模式。如果你不是,模式会伤害你,而不是帮助你。