当前位置
当前位置:万博体育手机版登录入口 > 万博体育手机版登录入口 >

SegmentFault

文章作者:admin 发布时间:2019-11-28 19:27

  在这个快速教程中,我们将看一下Null对象模式,这是设计模式的一个特例,一个经常被我们遗忘的特例。我们将描述它的目的以及我们何时应该考虑使用它。

  有时,如果此类if语句的数量变多,则代码的可读性会变得很差,难以阅读且容易出错。这是Null对象模式可以派上用场的时候。

  Null对象模式的目的是最小化这种空检查。相反,我们可以识别null行为并将其封装在客户端代码所期望的类中。这样我们就不再需要处理空引用的特殊处理。

  我们可以简单地处理null对象,就像处理实际包含一些更复杂的业务逻辑的给定类型的任何其他实例一样,以此来保持代码的清洁。

  由于null对象不应具有任何状态,因此无需多次创建相同的实例。因此,我们经常将null对象实现为单例。

  假设一个场景,有一个消息路由器模块。每条消息都应分配有效的优先级。我们的系统应该将高优先级消息路由到SMS网关,而具有中等优先级的消息应该路由到JMS队列。

  但是,有时会出现“未定义”或空优先级的消息。这些消息应该从进一步处理中丢弃。

  接下来,让我们创建上述接口的两个实现 - 负责路由到SMS网关的接口以及将消息路由到JMS队列的接口:

  我们可以看到,无论RouterFactory返回什么实现,我们都以相同的方式处理所有Router对象。这使我们能够保持代码的清洁和可读性。

  我们应该使用Null对象模式,否则客户端会检查null只是为了跳过执行或执行默认操作。在这种情况下,我们可以将do nothing逻辑封装在空对象中,并将其返回给客户端而不是空值。这样,如果给定实例为null,则客户端代码不再需要知道 。

  为了更好地理解何时应该使用Null对象模式,让我们假设我们必须实现CustomerDao接口,定义如下:

  如果没有客户匹配提供的搜索条件,大多数开发人员将从findByNameAndLastname()返回Collections.emptyList()。这是遵循Null对象模式的一个很好的例子。

  相反,getById()应返回具有给定id的客户。调用此方法的人希望获得特定的客户实体。如果不存在这样的客户,我们应该显式返回null以表示提供的ID存在问题。

  与所有其他模式一样,我们需要在盲目实现Null对象模式之前考虑我们的特定用例。否则,我们可能会无意中在代码中引入一些很难找到的错误。

  在本文中,我们了解了Null对象模式是什么以及何时可以使用它。我们还实现了一个设计模式的简单示例。

上一篇:JavaScript创建对象方式及性能问题
下一篇:没有了