我有以下代碼和體系結構(實際上這是一個非常簡化的版本)的抽象和具體類的consting。獲取數據到回調方法
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
方法中包含了大量的代碼(攤位,前後processData
電話),我想在多個處理器重用,爲此我把代碼放到一個抽象類。
的問題是:我想訪問其新添加的updateData
方法(這裏year
,month
,day
)提供的數據。當呼叫流經不知道這些參數的抽象類時,這些信息就會丟失。我如何修改這個架構來保存這些信息?
以下解決方案來到我的腦海裏,都用明顯的缺點:
- 提供URL中的抽象方法,並從那裏再次提取參數。
- 斯普利特
updateDataFromUrl
方法分爲兩個兩個方法(在processData
呼叫,事後部分之前的部分):(什麼問題也有,我只需要在procecssData
方法和從未在URL參數?)。現在直接在ConcreteProcessor中使用這些方法。 (問題:updateDataFromUrl
方法有很多方面,我需要兩者的前後processData
電話後我怎樣才能得到這個數據的新創建方法之間轉移。?)
「狀態」對象如何? 'public abstract String processData(String data,Object state);'你可以創建任何狀態並且你的抽象類只是轉發它,你的具體實現將知道它是什麼... – Fildor
@Fildor我想過同樣的,但是不是這種方法有點怪異嗎?我不確定這個...... – theomega
那麼,至少這是對代碼的最小改動,因爲它現在就是這樣。儘管與ewernli的第二種方法相比,這是一件非常有趣的事情。 – Fildor