我有很多方法(在这种情况下,来自网络服务,但这可能没有影响?)来调用。它们已经固定发布版本且不会被更改,由我来适应它们。我已经在项目中拥有代理,事实上,我已经调用了它们,项目也没问题。
此类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#,但我不介意是否有涉及其他版本或语言的答案。我更关心所涉及的概念。我感谢大家提供的任何提示,他们总是很棒。
答案 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 Pattern和Strategy 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