无需单独 class 即可保持向后兼容性

preserve backward compatibility without a separate class

假设有一个名为 Animal 的 class,它接收到包含动物属性(typecolorsize)的请求,然后它序列化并将其存储在数据库中。随着时间的推移,动物的特性会发生变化。添加了一些内容,现在我们还有 location

将有一个版本标志,可用于随时分支请求。

您如何调整动物 class 使其既能处理新请求又能处理旧请求?这有什么设计模式吗?

我认为您不需要特定的设计模式来实现这一点。您可以尝试以下两种方法并评估哪一种更适合您的情况:

  • 使用额外的参数位置重载当前的 Request 方法,例如 Animal::Request(type,color,size,location),这样您的 class 就可以同时处理这两个问题。更多关于重载 here.
  • 例如,
  • 将默认位置参数添加到您现有的 Request 方法,并将旧的 type,color,size 调用视为 type,color,size,'' 调用。更多关于默认参数 here.

有时您无法使某些东西向后兼容,这取决于您的域逻辑(规则)。

如果像 "location" 这样的新 属性 有一些默认值并且您对此没有问题,那么您可以处理旧请求,但如果您的应用需要该值才能正常工作,那么旧的请求将无效。