【发布时间】:2021-02-04 16:42:32
【问题描述】:
我有一个有一个或多个输入列表的类,它需要处理和更新其他范围之外的列表。在这里可以使用什么好的模式? 我在这里尝试了以下两种模式:
- 使用传递引用直接更新
- 使用回调让调用者处理他们希望如何处理更新
示例
- 使用直接更新
public class SomeClass {
public void process(List<String> inputList, List<StringContainer> errorContainerList, List<String> validList) {
for (String str : inputList) {
if (someCondition) {
validList.add(str);
} else {
errorContainerList.add(new StringContainer(str, new SomeError()));
}
}
}
}
void someCaller(List<String> inputList) {
List<String> validList = new ArrayList<>();
List<StringContainer> errorContainerList = new ArrayList<>();
SomeClass obj = new SomeClass();
obj.process(inputList, errorContainerList, validList);
// Similarly,
validList.remove(...);
errorContainerList.add(...);
}
- 使用回调
public interface StringErrorHandler {
void handle(String str, SomeError error);
}
public interface ValidInputHandler {
void handle(String str);
}
public class SomeClass {
public void process(List<String> inputList, StringErrorHandler errorHandler, ValidInputHandler validInputHandler) {
for (String str : inputList) {
if (someCondition) {
validInputHandler.handle(str);
} else {
errorHandler.handle(str, new SomeError());
}
}
}
}
void someCaller(List<String> inputList) {
List<String> validList = new ArrayList<>();
List<StringContainer> errorContainerList = new ArrayList<>();
SomeClass obj = new SomeClass();
obj.process(inputList, new StringErrorHandler() {
@Override
public void handle(String str, SomeError error) {
errorContainerList.add(new StringContainer(str, error));
}
}, new ValidInputHandler() {
@Override
public void handle(String str) {
validList.add(str);
}
});
// Similarly,
validList.remove(...);
errorContainerList.add(...);
}
【问题讨论】:
-
“好的”模式是什么意思?是什么让模式“好”?
-
你的这两种方法有什么问题?有例外吗?
-
@Sweeper 由于类似的情况经常发生,我想知道是否有任何我不知道的预先存在的模式。
-
@NomadMaker 第一种方法的问题是,如果输入和输出的数量增加,那么方法的参数数量会增加,这会使重构代码变得更加困难。对于第二种方法,我想知道它是否会使调试变得混乱。
标签: java design-patterns