我有一个小框架,可以用来创建管道和过滤器系统。
我想到了使用流畅的界面来构建管道和过滤器系统的想法:
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方法的代码。