以责任链模式在对象之间传递数据

Abr*_*mJP 4 c# design-patterns

在实施责任链模式时,我遇到了一个难题,即如何在链中的对象之间传递数据。对于每个对象,链中对象之间传递的数据类型可以不同。作为临时解决方案,我创建了一个包含堆栈的Static类,其中链中的每个对象都可以将结果推送到堆栈中,而链中的下一个对象可以从堆栈中弹出结果。这是关于我已实现的示例代码。

public interface IHandler
{        
  IHandler Successor {get; set; }
  void Process();        
}

//Temporary Data Container class to store objects\data    
public static class StackManager
{
  public static Stack DataStack = new Stack();
}

//This class doesn't require any input to operate
public class OpsA : IHandler
{
  public IHandler Successor {get; set; }
  public void Process()
   {
      //Do some processing, store the result into Stack
      var ProcessedData = DoSomeOperation();
      StackManager.DataStack.Push(ProcessedData);

      if(Successor != null) Successor();            
  }
}

//This class require input data to operate upon
public class OpsB : IHandler
{
  public IHandler Successor {get; set; }
  public void Process()
  {
      //Retrieve the results from the previous Operation
      var InputData =  StackManager.DataStack.Pop();

      //Do some processing, store the result into Stack
      var NewProcessedData = DoMoreProcessing(InputData);      
      StackManager.DataStack.Push(NewProcessedData);

      if(Successor != null) Successor();
  }
}

public class ChainOfResponsibilityPattern
{
  public void Process()
  {
       IHandler ProcessA = new  OpsA();  
       IHandler ProcessB = new  OpsB();

       ProcessA.Successor = ProcessB;
       ProcessA.Process();
  }
}
Run Code Online (Sandbox Code Playgroud)

请帮助我找到在链中的处理程序之间传递数据的更好方法。

Sor*_*anu 5

当您拥有责任链时,通常涉及单个上下文,因此一种好的方法是传递Context对象。

我要注意的一件事是上下文的可变性。

您可以具有可变的上下文,然后实例化上下文对象,并将其传递给ProcessorAProcessorA可以修改它并设置自己的数据,然后将其传递给ProcessorB。然后ProcessorB对其进行更多修改,最后调用者可以读取上下文。

如果您希望获得更高的数据安全性并将每Processor一个的行为封装为输入到输出黑匣子,则可以选择不可变的上下文对象。ProcessorA可能会收到一个空的上下文对象,然后构造一个for ProcessorB并返回ProcessorB的输出。


Roy*_*tus 1

为什么不直接传递一个字典,甚至一个列表呢?