Mik*_*ike 5 c# linq chain-of-responsibility c#-4.0
我有一系列任务,基本上是责任链模式的变体.
我的管道中的任务如下所示
internal interface IPTask<T>
{
bool CanExecute(T instance);
T Process(T instance);
}
Run Code Online (Sandbox Code Playgroud)
..和我的处理器看起来像
internal interface IProcessor<T>
{
T Execute(T instance);
}
Run Code Online (Sandbox Code Playgroud)
我的具体实现如下:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
..我的任务看起来像这样:
internal interface ITasks<T>
{
IEnumerable<IPTask<T>> GetTasks();
}
Run Code Online (Sandbox Code Playgroud)
T可以是不同的实例,但受通用合同的约束.其中一项任务是将传入对象映射到完全不同的对象,并从那里转发该实例.
现在正如您所看到的,我正在执行管道中的所有任务,我想将其修改为以下内容:
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;
}
Run Code Online (Sandbox Code Playgroud)
正如您目前所拥有的,它更像是复合模式而不是责任链。这一变化使其变得更加 CoR 风格。但更重要的是注意它是否满足您的需求,而不是使用正确的设计模式术语。:)
| 归档时间: |
|
| 查看次数: |
864 次 |
| 最近记录: |