【设计模式】空接口
(空)接口的用法总结
接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中,接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口,任务类可以被标识为在相应的阶段可以执行,从而在验证和执行逻辑中进行类型检查。
1. 接口定义(空接口,用来做标签)
定义两个接口,分别用于标识任务。举例如下,在暂停/恢复阶段和完成阶段的可执行性。
namespace MyApp.Workflow.Commands
{
public interface ICanRunInPauseResumePhase
{
}
public interface ICanRunInCompletionPhase
{
}
}
2. 实现接口的任务类
创建一个任务类,实现上述接口,以表明该任务可以在相应的阶段执行。
using MyApp.Workflow.Commands;
namespace MyApp.Workflow.Commands.Processing
{
public class DataProcessingTask : Task, ICanRunInPauseResumePhase, ICanRunInCompletionPhase
{
public DataInput InputData { get; } = new(nameof(InputData));
public override void Start(ITaskExecutionContext context)
{
// 执行数据处理逻辑
InputData.Process(context);
}
public override List<Error> Validate(ITaskExecutionContext context)
{
List<Error> errors = new List<Error>();
if (!InputData.IsValid())
{
var error = new Error(
ErrorSeverity.Critical,
context.Thread,
this,
"INVALID_INPUT_DATA",
InputData.Value == null ? string.Empty : InputData.Value);
errors.Add(error);
}
return errors;
}
public override List<IInput> Inputs() =>
new List<IInput>() { InputData };
}
}
3. 验证任务的有效性
在验证任务的逻辑中,使用接口来检查任务是否可以在特定阶段执行。为了利用接口Interface,这里,可以用泛型 或者模板的方式,
private static bool CanTaskBeUsedInPhase<TRequiredTaskInterface>(
Task task,
ITaskExecutionContext context,
List<Error> errors,
string errorMessage,
Task taskToAssignError)
where TRequiredTaskInterface : class
{
if (task is TRequiredTaskInterface)
{
return true;
}
errors.Add(new Error(
ErrorSeverity.Critical,
context.Thread,
taskToAssignError,
errorMessage));
return false;
}
4. 在工作流中使用
在工作流的执行过程中,根据任务是否实现了这些接口来决定是否执行该任务。
if (!CanTaskBeUsedInPhase<ICanRunInCompletionPhase>(task, context, errors, "Task not allowed in this phase", taskToAssignError))
{
continue;
}
总结
- 接口用于标识任务在特定阶段的可执行性。 空接口,可以赋予属性标签。
- 通过实现接口,任务类可以被标识为在相应的工作流阶段可以执行。
- 在验证和执行任务时,可以使用接口进行类型检查,以确保任务在适当的阶段被调用