我有一個共同的jar
,它使用一些String
對象的反編組。該方法應該根據從哪個應用程序調用而採取不同的行動,除了可以通過嘗試加載它具有的某個獨特類(不喜歡那樣)來識別應用程序之外,我該如何做到這一點。有沒有解決這個問題的設計模式?如何根據調用它的應用程序更改方法的行爲?
回答
正如我在我的評論中提到的那樣,要做的事情是將該超級方法分解爲封裝特定行爲的不同方法,並且可能還有另一種方法(由所有特定於應用程序的應用程序)處理共同的行爲。
要記住的最重要的事情是行爲很重要。如果某些事情在不同情況下行爲不同,則調用應用程序無法使用該方法,因爲它無法控制發生的情況。
如果仍然真的希望有一個單一的方法,所有的應用程序的調用每個一個行爲不同,你可以做到這一點,利用一定的設計模式,在某種程度上是有道理的,是維護。該模式被稱爲「Template Method」。
它的一般想法是,調用應用程序傳遞一個邏輯塊,被調用的方法將在需要時進行環繞並進行調用。這與使用閉包的函數式編程或編程非常相似,在這種情況下,您正在傳遞大量邏輯,就好像它是數據一樣。儘管Java本身不支持閉包,但其他基於JVM的語言如Groovy,Scala,Clojure,JRuby等。做了支持閉包。
同樣的總體思路是非常強大在某些情況下,和可能在你的情況下適用,但這樣的問題,需要的應用領域和建築非常親密的知識和是不是真的有足夠的信息在你的張貼的問題做得更深入。
其實,我認爲一個很好的面向對象的解決方案是,在普通的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();
- 1. 如何更改Surface應用程序的應用程序方向
- 2. 如何根據應用程序的整體主題更改`app:popupTheme`?
- 3. 如何根據SIM卡信息更改應用程序名稱?
- 4. C#根據字符串更改我調用的方法
- 5. 如何執行/調用ASP.NET Web應用程序C#方法中的JavaScript方法
- 6. 多線程WPF應用程序:調度程序調用。更有效的方法?
- 7. 如何根據協議調用方法?
- 8. 更改ASP.net應用程序根目錄?
- 9. 如何根據語言環境更改我的應用程序中的字體?
- 10. 如何爲獨立應用程序調用存儲庫方法?
- 11. 根據語言設置更改應用程序中的單詞
- 12. 方法是,根據它是如何被調用
- 13. 根據Java應用程序的執行方式改變Java應用程序的性能
- 14. 根據用戶選擇更改應用程序本地化
- 15. VS2008/2010調試器更改應用程序行爲
- 16. 如何將我的應用程序更改爲默認相機應用程序?
- 17. 根據調用方法更改返回類型
- 18. 可以更改Microsoft.Phone.Controls.Toolkit的行爲,並在應用程序中使用它
- 19. 如何更改python中的方法調用順序?
- 20. 如何在應用程序iphone的後臺調用方法?
- 21. 如何從UIViewController調用應用程序委託的方法?
- 22. 如何以編程方式更改OnClientClick事件並調用它?
- 23. 使用追蹤返回類型的寫入方法根據方法調用進行更改?
- 24. 在tomcat上更改spring mvc應用程序的應用程序根目錄
- 25. 程序更改的行爲取決於調用fork的位置
- 26. 我如何在我的Web應用程序中調用調用的方法
- 27. 如何從android應用程序調用遠程方法
- 28. 如何更改打開應用程序的默認方式
- 29. 如何更改另一個應用程序的屏幕方向
- 30. 如何根據行ID列表更改表中行的順序?
的「設計模式」,你_should_使用很簡單,就是沒有基於外部因素的方法行爲改變!不同的行爲應該是不同的方法。 – cdeszaq 2012-03-15 15:01:42
我第二@ cdeszaq的評論。它可以是普通功能的普通**罐子,也可以是特定應用的**特定行爲。如果您試圖在外部jar中分離出通用代碼,這很好。但是,你也必須編寫該代碼,就好像它不知道誰會調用它(避免代碼中的邏輯循環引用)。 – MicSim 2012-03-15 15:17:38