我有一个使用C#的客户端/服务器应用程序。
在我的设计中,客户端将通过C#类和方法向服务器请求服务器支持的一些数据过滤和收集。
我有一个服务器连接接收请求并将数据提供给客户端。为此,客户端请求对象,方法和参数。
因此,客户端会执行以下请求:
GetData (MyClass, MyMethod, MyParams[]);
一切正常我在服务器上使用当前的动态方法调用:
Type type = System.Type.GetType(MyClass);
object instance = System.Activator.CreateInstance(type);
MethodInfo method = type.GetMethod(MyMethod);
object[] parameters = new object[] { MyParams[] };
var data = method.Invoke(instance, parameters);
... data checking, filtering and returning to client...
我有一个问题,我有几个不同的对象和方法,每个都有不同的检查和过滤。由于动态对象不支持Intellisense,我检查数据后的代码是一个大混乱,难以支持甚至理解。
我希望有一种不同的方法,我可以使用Intellisense支持(已知类型)获取数据。这将使我的生活更轻松,代码更清晰。另一方面,我不打算使用不同的组合构建十几个GetData调用。
我想构建一个对象工厂,但我不确定哪种模式最适合这里。我确定这里有一个很好的模式,但是我看不出解决问题的方法......
非常感谢任何帮助。
答案 0 :(得分:1)
如果没有更多详细信息,很难确定问题的复杂性,但我认为您正在寻找策略模式
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyA.AlgorithmInterface()");
}
}
class ConcreteStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"Called ConcreteStrategyB.AlgorithmInterface()");
}
}
class Context
{
private Strategy _strategy;
// Constructor
public Context(Strategy strategy)
{
this._strategy = strategy;
}
public void ContextInterface()
{
_strategy.AlgorithmInterface();
}
}
class MainApp
{
/// <summary>
/// Entry point into console application.
/// </summary>
static void Main()
{
Context context;
// Two contexts following different strategies
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
// Wait for user
Console.ReadKey();
}
}
来自Design Patterns: Elements of Reusable Object-Oriented Software
<强>策略强>
定义一系列算法,封装每个算法,并制作 他们可以互换。策略允许算法独立变化 来自使用它的客户。
<强>适用性强>
在以下情况下使用策略模式:
许多相关类只在行为上有所不同。策略提供了一个 使用多种行为之一配置类的方法。
您需要不同的算法变体。例如,你可能 定义反映不同空间/时间权衡的算法。策略 可以在将这些变体实现为类层次结构时使用 算法
算法使用客户端不应该知道的数据。使用策略 模式,以避免暴露复杂的,特定于算法的数据结构。