2014-01-22 94 views
2

由於我遵循特定的項目指令序列,所以我稍微向後一點。我有兩個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,而不必將所有事件作爲參數傳遞(我建議不要這樣做,因爲它破壞了使用模板的重點)?

回答

0

一兩件事,好像我不得不引入非通用的方法來我的模板,只是調用主模板方法,

是的,你就需要引入這樣的方法爲您給出需求。但是正如你稍後所說的那樣,由於LineCount對象可以調用grep方法,因此這可能是不正確的,通過在您要編寫的非常用方法中執行instance of檢查可以避免這種情況。做這項工作,如果它符合預期的要求或退出。

對於你原來的問題,你遇到了

我hookMethods似乎不能夠訪問在commonFunctionality創建的實例變量(即當我試圖訪問在commonFunctionality創造了一個匹配,即使我將它聲明爲實例變量而不是方法級作用域,它也會返回null,就像我更喜歡的那樣)。

不能定義Java中的抽象的變量,在java中變量的唯一法律修改是

public, protected, private, static, final, transient, volatile 

,你需要有一個具體的實施commonFunctionality,你可以有一個getter方法它。您可以在抽象類中爲此定義抽象方法。請參閱本文的答案以獲得更多信息Abstract variables in Java?

+0

對不起,這是一個錯字。它應該是抽象類中聲明的保護變量,這似乎與模板模式方法一致。我已更新問題 –

+0

另外,commonFunctionality實際上不應該是一個類。這是代碼的具體實現,它包含兩個類共有的功能,等同於此處顯示的「某些實現」:http://www.oodesign.com/template-method-pattern.html 常用功能包括使用基於用於正則表達式的匹配器和模式的文件中的ArrayLists實例化變量,但是我的鉤子方法似乎沒有訪問變量。 –

0
RegexCommands myObject = new Grep(); 
myObject.grep(variables); 

RegexCommands myObject = new LineCount(); 
myObject.lineCount(variables); 

如果接口/摘要類RegexCommands定義了兩種方法,這是唯一可能的(在Java中)。因此,這兩個實施也需要實施它們。如果你想堅持這個要求,你可以這樣做,並讓Grep.lineCount()拋出一些例外。

一種解決方法可能是讓RegexCommands是一個門面,只有委託方法調用從RegexCommands.grep()new Grep().myObject()

但是,你應該聯繫請求澄清它。