我在以下几行中有一个相当基本的命令模式实现:
interface IProcessor
{
bool CanProcess(string input);
void Process(string input);
}
class ProcessorA : IProcessor
{
public bool CanProcess(string input)
{
return true;
}
public void Process(string input)
{
// do things
}
}
// and other implementations, ProcessorB, ..C, etc.
处理器将被注入DI,我将得到一个循环,该循环查找有效的处理器并执行它,如下所示:
foreach (var processor in processors)
{
if (processor.CanProcess("abc"))
{
processor.Process("abc");
}
}
到目前为止,一切都很好,除了其中一个处理器是穿透处理器,当所有其他处理器都声明它们无法处理时,必须执行该处理器-基本上我必须确保最后执行该处理器,因为它可以处理任何事情。问题在于,这是一个无序列表,因此我需要弄清楚如何使穿透式处理器最后执行。
我看到几种方法:
IPassThruProcessor
)。IProcessor
接口上添加标记属性,并在循环之前对处理器进行排序:interface IProcessor
{
bool CanProcess(string input);
void Process(string input);
bool IsPassThru { get; set; } // new prop
}
var processors = processors.OrderBy(x => x.IsPassThru).ToArray();
// IsPassThru = true goes to the back of the queue
// loop over processors
我真的不喜欢这两种方式,首先-因为它引入了特殊情况和特殊接口,其次-因为处理器对自身有所了解,这是一条外部信息。
有关如何设计此商品的任何建议?