由於我遵循特定的項目指令序列,所以我稍微向後一點。我有兩個Java類。其中一個模擬Linux的grep功能,另一個模擬lineCount功能。我已經實現了它們,但項目中的NEXT步驟是使用「將包含其他兩個程序共有的所有字段和算法」的模板方法模式創建超類。如何在模板方法模式中使用兩個名稱調用模板方法
這兩者之間有很多共同的功能,很明顯哪些部分需要成爲模板的一部分,哪些部分需要成爲實現的一部分。例如,它們中的每一個都需要能夠基於用於調用方法的路徑字符串創建File對象,並使用用於調用方法的正則表達式搜索文件列表方法。這是常見的功能,絕對應該是模板/抽象類的一部分。
這將是很高興能夠宣佈這樣的事情:
public abstract class RegexCommands{
protected Variables;
public Map<things> myMethod(variables){
//common functionality which includes storing and using the variables
hookMethod(); //based on what you create in commonFunctionality
return resultAfterHookMethod;
}
}
public class Grep extends RegexCommands{
public hookMethod(){
class specific things;
}
}
public class lineCount extends RegexCommands{
public hookMethod(){
class specific things;
}
}
,只是用
RegexCommands myObject = new Grep();
myObject.myMethod(variables);
調用它,並將它返回什麼我正在尋找(的grep命令LineCount對象的Grep對象,lineCount)。但是,說明明確指出它將如此調用:
RegexCommands myObject = new Grep();
myObject.grep(variables);
RegexCommands myObject = new LineCount();
myObject.lineCount(variables);
並且還表明所使用的變量略有差異。 (例如,lineCount不需要substringSelectionPattern)我現在設置的方式是掛鉤的方法對其父級調用super,並且該模板調用myMethod。這顯然不是它應該工作的方式。首先,好像我不得不在我的模板中引入非常見的方法,這只是稱爲主模板方法,這意味着理論上(雖然我沒有測試過),可以執行類似
RegexCommands myObject = new LineCount();
myObject.grep(variables);
這不是我想要允許的行爲,並且似乎失敗了使用模板的目的。另一個問題(我實際遇到過)是我的hookMethods似乎無法訪問以commonFunctionality創建的實例變量(即,當我嘗試訪問以commonFunctionality創建的匹配器時,即使我將它聲明爲一個實例變量而不是方法級別的範圍,就像我更喜歡的那樣)。
所以我有點卡住,尋求一些幫助。如何讓這些對象在模板中使用myMethod模式,而沒有這種破壞我的對象分離性的可怕解決方法,以及如何使用commonFunctionality中的非常用方法使用ArrayLists和/或Maps,而不必將所有事件作爲參數傳遞(我建議不要這樣做,因爲它破壞了使用模板的重點)?
對不起,這是一個錯字。它應該是抽象類中聲明的保護變量,這似乎與模板模式方法一致。我已更新問題 –
另外,commonFunctionality實際上不應該是一個類。這是代碼的具體實現,它包含兩個類共有的功能,等同於此處顯示的「某些實現」:http://www.oodesign.com/template-method-pattern.html 常用功能包括使用基於用於正則表達式的匹配器和模式的文件中的ArrayLists實例化變量,但是我的鉤子方法似乎沒有訪問變量。 –