2012-03-15 49 views
5

我有一個共同的jar,它使用一些String對象的反編組。該方法應該根據從哪個應用程序調用而採取不同的行動,除了可以通過嘗試加載它具有的某個獨特類(不喜歡那樣)來識別應用程序之外,我該如何做到這一點。有沒有解決這個問題的設計模式?如何根據調用它的應用程序更改方法的行爲?

+12

的「設計模式」,你_should_使用很簡單,就是沒有基於外部因素的方法行爲改變!不同的行爲應該是不同的方法。 – cdeszaq 2012-03-15 15:01:42

+4

我第二@ cdeszaq的評論。它可以是普通功能的普通**罐子,也可以是特定應用的**特定行爲。如果您試圖在外部jar中分離出通用代碼,這很好。但是,你也必須編寫該代碼,就好像它不知道誰會調用它(避免代碼中的邏輯循環引用)。 – MicSim 2012-03-15 15:17:38

回答

3

正如我在我的評論中提到的那樣,要做的事情是將該超級方法分解爲封裝特定行爲的不同方法,並且可能還有另一種方法(由所有特定於應用程序的應用程序)處理共同的行爲。

要記住的最重要的事情是行爲很重要。如果某些事情在不同情況下行爲不同,則調用應用程序無法使用該方法,因爲它無法控制發生的情況。

如果仍然真的希望有一個單一的方法,所有的應用程序的調用每個一個行爲不同,你可以做到這一點,利用一定的設計模式,在某種程度上是有道理的,是維護。該模式被稱爲「Template Method」。

它的一般想法是,調用應用程序傳遞一個邏輯塊,被調用的方法將在需要時進行環繞並進行調用。這與使用閉包的函數式編程或編程非常相似,在這種情況下,您正在傳遞大量邏輯,就好像它是數據一樣。儘管Java本身不支持閉包,但其他基於JVM的語言如Groovy,Scala,Clojure,JRuby等。做了支持閉包。

同樣的總體思路是非常強大在某些情況下,和可能在你的情況下適用,但這樣的問題,需要的應用領域和建築非常親密的知識和是不是真的有足夠的信息在你的張貼的問題做得更深入。

2

其實,我認爲一個很好的面向對象的解決方案是,在普通的jar中,有一個基類和幾個派生類。基類將包含被調用方法的公共邏輯,並且每個派生類都將包含特定的行爲。

所以,在你的罐子,你可能有以下幾點:

public abstact class JarClass { 
    public method jarMethod() { 
     //common code here   
    } 
} 

public class JarClassVersion1 extends JarClass { 
    public method jarMethod() { 
     // initiailzation code specific to JarClassVerion1 
     super.jarMethod(); 
     // wrapup code specific to JarClassVerion1 
    } 
} 

public class JarClassVersion2 extends JarClass { 
    public method jarMethod() { 
     // initiailzation code specific to JarClassVerion2 
     super.jarMethod(); 
     // wrapup code specific to JarClassVerion2 
    } 
} 

至於來電顯示是如何工作的,如果你願意來設計你的代碼,使這些知識派生類中使用居住與調用者,那麼你顯然只需要調用者創建適當的派生類並調用jarMethod。

但是,我從您的問題中瞭解到,您需要知道哪個類用於駐留在jar中。在這種情況下,有幾種解決方案。但是一個相當簡單的方法是在jar中定義一個工廠方法,它創建適當的派生類。所以,抽象JarClass裏面,你可能會定義下面的方法:

public static JarClass createJarClass(Class callerClass) { 
    if (callerClass.equals(CallerClassType1.class)) { 
     return new JarClassVersion1(); 
    } else if (callerClass.equals(CallerClassType2.class)) { 
     return new JarClassVersion1(); 
     // etc. for all derived classess 
} 

然後調用者會簡單地做到以下幾點:

JarClass.createJarClass(this.getClass()).jarMethod(); 
相關問題