作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个任务管道,基本上是责任链模式的变体。
我的管道中的任务如下所示
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/
理想情况下,Spring MVC 应用程序中的 Controller 必须接收请求、将请求发送到 API、将(调用的)结果加载到模型(以便 View 随后呈现它)并转发到 View 。他们不应该再做了
我是一名优秀的程序员,十分优秀!