我可以调用执行类似功能的不同类(使用不同的方法和类型)吗?

时间:2011-02-04 15:56:54

标签: c# design-patterns

我有很多方法(在这种情况下,来自网络服务,但这可能没有影响?)来调用。它们已经固定发布版本且不会被更改,由我来适应它们。我已经在项目中拥有代理,事实上,我已经调用了它们,项目也没问题。

此类main方法获取一些输入参数(事务类型和包含事务数据的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种不同的交易类型,但它是按照你上面的方式开发的。由于我即将改变它(将此代码移动到自己的库中,因为其他系统需要这种逻辑),我认为它可以从一些代码改进中受益。此外,上面的代码相当减少:有更多的行处理每种情况的特定类型,我只是举了一个例子。

由于它的工作原理,我并不那么担心,但它对我来说似乎并不那么“优雅”。给我一种印象,即某种设计模式可以处理这种情况,并且我可以使用单个块处理任何事务,而不是为每种事务类型重复它。也许我错了,这不可能做到,我只是通过查看重复的代码“感觉到”它。

这是.NET v2.0上的C#,但我不介意是否有涉及其他版本或语言的答案。我更关心所涉及的概念。我感谢大家提供的任何提示,他们总是很棒。

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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 );
    }
}

答案 2 :(得分:0)

看一下策略模式。 Strategy Pattern