开放封闭原则和规范模式的重要性。

Lehlohonolo Isaac,iOS开发人员,DVT

您是否曾经不得不一遍又一遍地重写相同的功能? 举例来说, 您想按类型,颜色和价格过滤车辆列表。

尽管有不同的规范,但我将通过编写三个过滤函数来实现此目的。 因此,即使这三个功能执行相同的操作(正在过滤车辆列表),这三个功能也仅因其规格不同而不同。

解决此问题的简单方法是将规范插入过滤器中。 在这种情况下,我们将只有一个过滤器。 为了使我们能够按颜色进行过滤,我们将注入颜色说明。 要按类型过滤,我们将插入“车辆类型规范”,依此类推。 现在,我们的应用程序只有一个过滤器。

让我们看一下如果在上面的示例中不使用“规范”模式,将会发生什么。

让我们首先创建一个Vehicle对象。

现在,假设您具有以下定义的车辆清单。

让我们创建一个Filter类:

下面的代码段演示了过滤车辆列表的方式:

仅当您知道Vehicle具有一个属性大小时,这才足够好。 但是,它足以应付车辆规格的变化,即当我们现在要按颜色或车辆类型过滤车辆列表时,它将无法正常工作。 取而代之的是,我们必须在VehicleFilter中添加另一个函数,该函数不可行,因为它不遵循开放式封闭原则(OCP)。

我们如何克服这一弊端? 好吧,我要实现的解决方案之一是按规范过滤,而不是明确说明过滤标准。

通过这样做,您可以使VehicleFilter具有足够的灵活性,以适应各种过滤条件。

让我们定义车辆规格。

因此,我们可以指定以下过滤条件:

让我们创建一个过滤器协议。

让我们看看上述变化将如何帮助我们遵守开放式封闭原则。

从上面的代码片段可以看到,我们现在可以过滤颜色和大小,而无需创建两个过滤器。 这使我们的过滤器类别遵循SRP(单一责任原则)和OCP(开放-封闭原则)。

规范模式还可以做很多事情。 例如,您可以创建一个具体的规范来处理要同时按大小和颜色过滤列表的情况。 这称为And规范。 但是,AND有一个缺点。 它没有严格遵循单一责任原则。

我希望您对规范模式学到了很多。

我还要感谢Kennedy Sigauke对创建此博客所做的贡献。