諮詢

2012-06-13 75 views
2

我有一個設計問題諮詢

我需要創建方法,DoSomething的,當DoSomething的被稱爲情況A的簽名是不是當它被調用來區分B.

doSomething(param1, param2) When called from A 
doSomething(param3, param4) When called from B 
不同

最初我想創建一個接口,並在情況A和情況B實現它

(PS。我確實需要一些這樣的方法有同樣的問題

doSomething1(T) When called from A 
doSomething1(X) When called from B 

doSomething2(E) When called from A 
doSomething2(N) When called from B 

等)

能否請您提出一個優選的設計?


編輯:改變了問題希望這是更清晰

+2

這是什麼情況?這是一堂課嗎?參數類型之間是否存在關係?這個問題很難理解。 – ftr

+2

我不清楚你的符號。是'A','B'等類名?參數列表中的「A」與「From A」中的A相同嗎?什麼是設計問題? –

+2

你不能簡單地使用重載? – adarshr

回答

2

您可以使用Java泛型與策略設計模式來解決這個問題:

讓我們假設你有兩個「案件」情況1和情況2,和你,我們稱之爲具備爲DoSomething的()方法的類每個案例「處理程序」。

首先我們要定義處理程序接口:

public interface Handler<TYPE1, TYPE2, TYPE3>{ 

    void doSomething(TYPE1, TYPE2, TYPE3); 

    void doSomethingElse(TYPE3); 

} 

你的處理程序將如下所示:

public class Case1Handler implements Handler<Case1Type1, Case1Type2, Case1Type3>{ 

    public void doSomething(Case1Type1 t1, Case1Type2 t2, Case1Type3 t3){ 
     // do case 1 business 
    } 

    public void doSomethingElse(Case1Type3 t3){ 
     // do case 1 business 
    } 

} 

,你就會有案例2有着相似的應用。

現在,您仍然編碼doSomething()和doSomethingElse()兩次相同的業務,Strategy Pattern可以幫助您。

基本上,您可以對不同類型的對象執行相同的業務。您可以將這些差異移到另一個類別(策略),並將此策略注入執行Handler的一個

public class HandlerImpl<TYPE1, TYPE2, TYPE3> implements Handler<TYPE1, TYPE2, TYPE3>{ 

    private Strategy<TYPE1, TYPE2, TYPE3> strategy; 

    public HandlerImpl(Strategy<TYPE1, TYPE2, TYPE3> strategy){ 
     this.strategy = strategy; 
    } 

    public void doSomething(TYPE1 t1, TYPE2 t2, TYPE3 t3){ 
     // do your business using "strategy" 
    } 

    public void doSomethingElse(TYPE3 t3){ 
     // do your business using "strategy" 
    } 

} 

這看起來有點矯枉過正,但絕對不是。這使得你的代碼更清潔,更改(添加新案例,改變業務)將更容易實現:)

1

所以,你有一個處理一個特定類型的數據的方法,而是從一個類或其他調用的時候,數據看起來有點不同。

如果這是不正確的,你的數據是完全不同的和不相關的,你可能真的想要做幾種方法。

如果數據是相似的,我建議你創建一個包含像這樣的數據的對象:

public class MyData { 
    public MyData(A, B, C){ /* Do your thing */ } 
    public MyData(D, E, F){ /* Do your other thing */ } 

然後有你試圖實現需要MyData的對象作爲參數的接口

doSomething(MyData data); 

這就是我可能會用你已經解釋過的,但如果這不起作用,請隨時給我們反饋!

1
doSomething1(T) When called from A 
doSomething1(X) When called from B 

如果DoSomething的()確實在這兩種方法同樣的事情,那麼你就可以實現的方法doSometing(S),其中S是通過接口T和X的

實現。如果T和X是相當不同的那麼你可能想要分別提供doSomething(T)和doSomething(X)的DoerT和DoerX類。