我有一个小框架,可以用来创建管道和过滤器系统。
我想到了使用流畅的界面来构建管道和过滤器系统的想法:

        PipeFilter pipeFilter = PipeFilter.StartBuild()
            .AddFilter(new SomeFilter1())
            .AddFilter(new SomeFilter2())
            .AddFilter(new SomeFilter3())
            .AddFilter(new SomeFilter4())
            .Build();


显示的代码按预期方式工作。这是系统的“图片”:

SomeFilter1 -> SomeFilter2 -> SomeFilter3 -> SomeFilter4


现在,有一种过滤器,而不是一个输出有两个。我称它为bifurcation
这是带有bifurcation的系统的示例:

              |-> SomeFilter2 -> SomeFilter3
SomeFilter1 --|
              |-> SomeFilter4


我想实现这样的事情:

        PipeFilter pipeFilter = PipeFilter.StartBuild()
            .AddFilter(new SomeFilter1())
            .AddBifurcation()
                .Output1()
                    .AddFilter(new SomeFilter2())
                    .AddFilter(new SomeFilter3())
                .Output2()
                    .AddFilter(new SomeFilter4())
            .Build();


但是看来我做对了。这甚至有可能做到吗?
在第一个示例中,我只需要一个PipeFilterBuilder(由PipeFilter.StartBuild()返回)。在第二个示例中,我尝试创建其他类型的构建器以进行混合,但这似乎无济于事。

忘了提一下,这个想法是我可以将分支分支嵌套在我想要的任何地方,也就是说,我可以得到充满树枝的“树”!

有人可以帮上忙吗?

最佳答案

我会按照以下方式

PipeFilter pipeFilter = PipeFilter.StartBuild()
        .AddFilter(new SomeFilter1())
        .AddBifurcation(
              withOutput(1)
                 .AddFilter(new SomeFilter2())
                 .AddFilter(new SomeFilter3()), /* this separates first and second output */
              withOutput(2)
                .AddFilter(new SomeFilter4())
              )
        .Build();


用更多的格式术语,我将Bifurcation类定义为Filter接口的实现者。

分叉可以具有任意多个使用Output对象链接的输出过滤器。为了区分这些输出对象,它们都具有索引。

结果,addBifurcation创建一个新的Bifurcation对象并将其添加,而withOutput(int)是创建Output对象的静态方法,该对象具有所有必需的方法。请注意,这一点意味着您摆脱了Builder与所构建对象之间的经典区别,转而使用了在Filter的基本接口中定义了Builder方法的代码。

10-08 13:40