这种设计模式叫什么名字?

3

根据实现的 CanProcess,从一组 IProcess 实现中找到正确的一个。

public interface IProcess
{
    bool CanProcess(string name);
    Task Process();
}

public class Processor
{
    private readonly IEnumerable<IProcess> _processors;

    public Processor(IEnumerable<IProcess> processors)
    {
        _processors = processors;
    }

    public void Process(string name)
    {
        Guard.RequireNonNullOrEmpty(name, "name");

        // this could allow for processing multiple matches
        var processor = _processors.FirstOrDefault(r => r.CanProcess(name));
        if (processor!= null)
        {
            processor.Process();
        }
    }
}

有人能为这种模式提供建议吗?我看了几个,但好像都不太合适。


2
这是一个同时使用了“命令(Command)”模式和“测试者/执行者(Tester/Doer)”模式的程序设计。 - Matthew Watson
这里用于定位正确的 IProcess 实现的模式名称是什么,因为可能有许多不适合的实现。 - Jake Aitchison
我认为没有一个模式可以描述那个。它只是一个查询。并不是每一行代码都需要与正式的设计模式相关联。 - David Osborne
2个回答

5

我真正寻找的是使用“CanProcess”定位可以满足“name”的“IProcess”实现模式的名称。 - Jake Aitchison
正如我之前所说,那并不是一个真正的正式设计模式。那只是一个查询而已。你或许可以说它是一种服务定位的形式? - David Osborne
好的,谢谢。我更喜欢它只是一个查询而不是服务定位,因为后者被认为是一种反模式。 - Jake Aitchison
1
是的。这并不是真正的服务定位,因为您是在构造函数中注入适当的处理器。此外,它可能更有效率,因为 FirstOrDefault() 只是一个 foreach。对于大量的处理器,使用字典会更好。 - David Osborne
这背后的想法是,IProcess 知道它可以处理什么,那么当需要调用 CanHandle 来发现合适的 IProcess 时,我该如何将 FirstOrDefault() 迭代替换为使用字典的版本? - Jake Aitchison
是的。这是我在工厂中经常使用的一种技术。我认为从多态性的角度来看它并不完美,但它运行良好,并且在我看来是一种优雅的解决方案。我关于字典的观点是,处理器可以按它们支持的进程名称进行键控,以实现更高效的查找。这只是我为自己的实现思考的一些东西。 - David Osborne

1

看起来像是穷人版的责任链模式chain of responsibility。如果你修改IProcess(以及它的实现)来允许建立相关联的链,而不是使用Processor,那么你将得到相同的行为,同时还能够处理相同的数据在各种进程中,以防需要。


我同意它看起来很相似,一开始我以为它可能是责任链模式,它确实以类似的方式解决了一个类似的问题。 - Jake Aitchison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接