命令模式下的执行顺序

时间:2019-08-27 17:51:38

标签: design-patterns .net-core

我在以下几行中有一个相当基本的命令模式实现:

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");
    }
}

到目前为止,一切都很好,除了其中一个处理器是穿透处理器,当所有其他处理器都声明它们无法处理时,必须执行该处理器-基本上我必须确保最后执行该处理器,因为它可以处理任何事情。问题在于,这是一个无序列表,因此我需要弄清楚如何使穿透式处理器最后执行。

我看到几种方法:

  • 使直通处理器成为特殊情况,使其实现特定的接口,并在所有其他处理器都用尽时显式调用它。这会在循环后添加一个检查,并为DI添加一个额外的接口(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

我真的不喜欢这两种方式,首先-因为它引入了特殊情况和特殊接口,其次-因为处理器对自身有所了解,这是一条外部信息。

有关如何设计此商品的任何建议?

0 个答案:

没有答案