2014-01-15 54 views
0

在我的應用程序中,應該有兩種登錄方式:通過用戶/密碼手動或自動從操作系統(連接到活動目錄服務器)檢索憑據。使用可選憑據來定義用戶驗證界面

爲了是柔性的,我已創建一個新的接口:

interface SignOnProcessor { 
    boolean verifyLogin(SignOnCredentials _credentials) 
} 

其中SignOnCredentials是沒有任何方法的接口。

之後,我創建了兩個實現SignOnProcessorPasswordSignOnProcessorSingleSignOnProcessor。兩者都在其verifyLogin()方法中實現不同的邏輯。

PasswordSignOnProcessor需要用戶名和密碼,因此PasswordSignOnCredentials是這樣實現的:

class PasswordSignOnCredentials implements SignOnCredentials { 
    String getUserName(); 
    String getPassword(); 
} 

SingleSignOnProcessor,在另一方面,不需要任何憑證。它只會向操作系統詢問必要的信息。所以我目前正在傳遞一個空實現SignOnCredentials的:

class SingleSignOnCredentials implements SignOnCredentials { 
    // Nothing here, credentials are retrieved from OS 
} 

沒有在verifyLogin()方法與SingleSignOnCredentials完成。

我有這樣的感覺,必須有更好的方法。我不應該創建並傳遞一個對象到verifyLogin()然後不使用它。 我能想到的另一個解決方案是創建一個沒有任何參數的接口方法verifyLogin()。這也感覺不對。

這種情況下的首選解決方案是什麼?應該有一些很好的,乾淨的方式來做到這一點,但目前我被卡住了。任何幫助表示讚賞!

回答

0

我看到另一個問題。以此示例爲例:

SignOnProcessor sop = new PasswordSignOnCredentials(); 
sop.verifyLogin(new SingleSignOnCredentials()); 

因爲這是可能的,所以您必須在實施中檢查憑證對象。你想要做的是概括兩個實際上有不同參數的方法。即使你將參數包含在一個對象中,也可以概括該對象,情況就是這樣。

因爲我不知道你的調用代碼,我假設你總是知道哪個實現被調用(意味着你不依賴於一些動態綁定魔法)。在這種情況下,我有兩種可能的解決方案:

在我看來,正確的做法是創建兩個操作。在這種情況下,您將有一個可以同時執行這兩個操作的SignOnProcessor實現。也許你可以用不同的名字命名它們。

如果您的所有(未來)實現都需要相同的參數或根本不需要,另一種方法將適用。我認爲在某些實現中不使用參數是可以的。如果您使用SSO,則可以將null作爲實際參數。

儘管這兩個選項對我來說都不完美,但我不認爲這是強制性的壞風格(取決於您的調用代碼)。但我想聽聽其他答案:-)

0

爲什麼你需要「靈活」? 僅僅爲了創建奇特的接口不是一個好主意。試着用最簡單的方式解決你的問題,並看看它是如何發展的。

很難提出任何建議,因爲您沒有指定您的應用程序如何實際選擇要調用的方法,正如AndréStannek已經指出的那樣。