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)
请帮助我找到在链中的处理程序之间传递数据的更好方法。
当您拥有责任链时,通常涉及单个上下文,因此一种好的方法是传递Context对象。
我要注意的一件事是上下文的可变性。
您可以具有可变的上下文,然后实例化上下文对象,并将其传递给ProcessorA。ProcessorA可以修改它并设置自己的数据,然后将其传递给ProcessorB。然后ProcessorB对其进行更多修改,最后调用者可以读取上下文。
如果您希望获得更高的数据安全性并将每Processor一个的行为封装为输入到输出黑匣子,则可以选择不可变的上下文对象。ProcessorA可能会收到一个空的上下文对象,然后构造一个for ProcessorB并返回ProcessorB的输出。