2011-02-04 65 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

相关问题