【发布时间】:2012-11-22 14:16:33
【问题描述】:
我有以下代码和架构(实际上这是一个非常简化的版本),其中包含一个抽象类和一个具体类。
public abstract class AbstractProcessor {
public void updateDataFromUrl(String url) {
//Download url
//Decrypt, and do a lot of stuff,
String data = "abc"; //Result from downloading
String processed = processData(data);
//Do a lot of other things with the transformed data
}
public abstract String processData(String data);
}
final class ConcreteProcessor extends AbstractProcessor {
public void updateData(int year, int month, int day) {
String url = String.format("http://%d.%d.%d", year, month, day);
updateDataFromUrl(url);
}
@Override
public String processData(String data) {
//Process the data
//---------------
//PROBLEM:
//----------------
//Need access to year, month, day ....
return null;
}
}
updateDataFromUrl 方法包含很多我想在多个处理器中重用的代码(booth,在processData 调用之前和之后),因此我将代码放入一个抽象类中。
问题是:我想访问提供给新添加的updateData 方法的数据(这里是year、month、day)。当调用流经不知道这些参数的抽象类时,这些信息就会丢失。如何修改此架构以保留此信息?
我想到了以下解决方案,它们都有明显的缺点:
- 提供带有 url 的抽象方法并再次从那里提取参数。 (问题:有哪些参数我只需要在
procecssData方法中而不在url 中?) - 将
updateDataFromUrl方法拆分为两个两个方法(processData调用之前的部分和之后的部分)。现在直接在 ConcreteProcessor 中使用这些方法。 (问题:updateDataFromUrl方法有很多我需要的上下文,在processData调用之前和之后。我怎样才能在新创建的方法之间传输这些数据?)
【问题讨论】:
-
“状态”对象怎么样。
public abstract String processData(String data, Object state);你可以声明任何东西,你的抽象类只需转发它,你的具体实现就会知道它是什么...... -
@Fildor 我也是这么想的,但是这种方法是不是有点老套?我不确定这个....
-
好吧,至少它是对代码的最小更改,就像现在一样。虽然与 ewernli 的第二种方法相比,它是 hacky。
标签: java callback code-reuse