gpt4 book ai didi

c# - 执行责任链变化

转载 作者:太空狗 更新时间:2023-10-29 23:09:37 24 4
gpt4 key购买 nike

我有一个任务管道,基本上是责任链模式的变体。

我的管道中的任务如下所示

internal interface IPTask<T>
{
bool CanExecute(T instance);
T Process(T instance);
}

..我的处理器看起来像

internal interface IProcessor<T>
{
T Execute(T instance);
}

我的具体实现是这样的:

public class Processor<T> : IProcessor<T>
{
private readonly ITasks<T> tasks;

public Processor(ITasks<T> tasks)
{
this.tasks= tasks;
}

public T Execute(T instance)
{
var taskstoExecute = tasks.GetTasks()
.Where(task => task.CanExecute(instance));

taskstoExecute.ToList().ForEach(task=>task.Process(instance));

return T;
}
}

..我的任务是这样的:

internal interface ITasks<T>
{
IEnumerable<IPTask<T>> GetTasks();
}

T 可以是不同的实例,但受通用契约(Contract)的约束。其中一项任务是将传入对象映射到一个完全不同的对象,并从那里转发该实例。

现在如您所见,我正在执行管道中的所有任务,我想将其修改为以下内容:

  • 下一个任务的 Execute 方法的输入应该来自先前执行的任务。
  • 如果任务的 CanExecute 失败,则管道应停止处理任务。

你能帮我搞定这个吗?此外,您是否希望为此目的对代码进行不同的结构化?

最佳答案

这个怎么样:

public T Execute(T instance)
{
T result = instance;
foreach(var individual in tasks.GetTasks())
{
if(!individual.CanExecute()) break;

result = individual.Process(result);
}

return result;
}

正如您目前所拥有的那样,它更像是一种复合模式,而不是责任链。此更改使其更像 CoR。但是注意它是否满足您的需求比使用正确的设计模式行话更重要。 :)

关于c# - 执行责任链变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com