2011-02-04 66 views
3

我有很多方法(在這種情況下,從Web服務,但也許這沒有影響?)來調用。它們已經是固定版本,不會更改,這取決於我適應它們。我已經在我的項目上有代理了,事實上,我已經給他們打電話了,項目還可以。我可以調用執行類似功能的不同類(使用不同的方法和類型)嗎?

該類的主要方法獲取一些輸入參數(事務類型和包含事務數據的XML字符串)。基於TransactionType,我知道應該調用哪個類和方法。我還必須爲它提供一個它所期望的類型變量,它已經從提供的XML構建而來。下面是今天(我沒有代碼就在這裏,所以原諒我的語法錯誤),大約是如何:

public class MyClass() 
{ 
    public void MyMethod(string TransactionType, string XML) 
    { 
    switch(TransactionType) { 
     case "1": 
     type1VO type1Object = (new Deserializer<Type1>()).XML2Object(XML); 
     ws = new WSProxy1(); 
     string response = ws.Method1(type1VO); 
     // 
     // lots of other lines of code that use type1VO, type1Object, the response, etc. 
     // 
     break; 
     case "2": 
     type2VO type2Object = (new Deserializer<Type2>()).XML2Object(XML); 
     ws = new WSProxy2(); 
     string response = ws.Method2(type2VO); 
     // 
     // same structure here, but handling types specific for "case 2" 
     // 
     break; 
    } 
    ... 
    } 
} 

它的推移和。今天,這段代碼已經在運行,處理大約15種不同的事務類型,但是它的開發方式如上所述。在我要改變它的時候(會將這段代碼移到它自己的庫中,因爲其他系統需要這個邏輯),我認爲它可以從一些代碼優化中受益。另外,上面的代碼非常簡化:每行都有更多的行處理特定的類型,我只是舉了一個例子。

因爲它的工作原理,我並不擔心,但對我來說看起來並不那麼「優雅」。給我的印象是某種設計模式可以處理這種情況,並且我可以用一個塊處理任何事務,而不是爲每個事務類型重複它。也許我錯了,這不可能完成,我只是通過查看重複的代碼來「感受」它。

這是C#.NET 2.0版,但我不介意是否有涉及其他版本或語言的答案。我更關心涉及的概念。我感謝你們提供的任何提示,他們都很棒。

回答

1

您可以嘗試組合Adapter PatternStrategy Pattern

爲支持此接口的每個代理創建一個調用方法和寫入適配器的接口。適配器應該封裝任何特定於它正在適應的對象的行爲。您也可以讓界面返回它們支持的事務類型,以便在運行時進行切換。

一個例子可能是:

public interface IExecuteStrategy 
{ 
    string TransactionType {get;} 
    void Execute(string xmlData); 
} 

public class WsProxy1Adapter : IExecuteStrategy 
{ 
    public string TransactionType 
    { 
     get { return "1"; } 
    } 

    public void Execute(string xmlData) 
    { 
     Type1 type1Object = (new Deserializer<Type1>()).XML2Object(XML); 
     var ws = new WSProxy1(); 
     string response = ws.Method1(type1Object); 
     // 
     // lots of other lines of code that use type1VO, type1Object, the response, etc. 
     // 
    } 
} 

public class WsProxy2Adapter : IExecuteStrategy 
{ 
    public string TransactionType 
    { 
     get { return "2"; } 
    } 

    public void Execute(string xmlData) 
    { 
     Type2 type2Object = (new Deserializer<Type2>()).XML2Object(XML); 
     var ws = new WSProxy2(); 
     string response = ws.Method1(type2Object); 
     // 
     // lots of other lines of code that use type1VO, type1Object, the response, etc. 
     // 
    } 
} 

public class MyClass 
{ 
    private static Dictionary<string, IExecuteStrategy> _transactionHandlers; 

    static MyClass() 
    { 
     _transactionHandlers = new Dictionary<string,IExecuteStrategy>(); 

     IExecuteStrategy obj = new WsProxy1Adapter(); 
     _transactionHandlers.Add(obj.TransactionType, obj); 

     obj = new WsProxy2Adapter(); 
     _transactionHandlers.Add(obj.TransactionType, obj); 
    } 


    public void MyMethod(string TransactionType, string XML) 
    { 
     _transactionHandlers[TransactionType].Execute(XML); 
    } 
} 
1

您應該創建一個抽象類,它理解基本流程如何處理事務類型。然後爲每種交易類型創建一個子類,填寫類型特定的代碼。這可能是一個開始你的基類根據您所提供的代碼:

abstract class Base<T, U> 
{ 
    private U _obj; 
    public Base(string xml) 
    { 
    _obj = (new Deserializer<T>()).XML2Object(xml); 
    } 

    public abstract void process(); 
    protected abstract String getResponse(); 
} 

然後做一個簡單的工廠返回基於交易類型正確的子類。然後這可以讓你的大案例陳述如下:

public void MyMethod(string transactionType, string xml) 
{ 
    Base.getByTransactionType(transactionType).process(); 
} 
+0

謝謝你的提示,哥們。我嘗試過使用更接近這個的東西,但是我仍然因爲必須在子類中繼續重複代碼而感到困擾。也許,有時候沒有「魔法」可以做,而你必須接受它,我想這可能是其中一種情況。再次感謝非常簡單而有效的格式! – 2011-02-04 18:39:05

+0

如果你發現你仍然在重複代碼,那意味着可能有更多的東西被拖入基類。這是尋找共同點並利用它們的問題。 – unholysampler 2011-02-04 19:09:36

相關問題