0

我有一个使用 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 调用。

我正在考虑建立一个对象工厂,但我不确定哪种模式最适合这里。我敢肯定这里有一个很好的模式可以使用,但我看不到我的问题的解决方案......

很感谢任何形式的帮助。

4

1 回答 1

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();
        }
      }

引用设计模式:可重用的面向对象软件的元素

战略

定义一系列算法,封装每个算法,并使它们可互换。策略让算法独立于使用它的客户而变化。

适用性

在以下情况下使用策略模式:

  1. 许多相关类仅在行为上有所不同。策略提供了一种使用多种行为之一配置类的方法。

  2. 您需要算法的不同变体。例如,您可以定义反映不同空间/时间权衡的算法。当这些变体被实现为算法的类层次结构时,可以使用策略

  3. 算法使用客户不应该知道的数据。使用策略模式来避免暴露复杂的、特定于算法的数据结构。

于 2014-06-20T05:23:11.977 回答