我需要能够有条件地执行一个方法。出于多种原因,我不喜欢在我的代码中使用一堆 IF 语句,最值得注意的是在将来的某个时间点将不再使用该方法。
我不确定执行此操作的最佳方法或我应该选择哪种模式来完成此任务。
我指的应用程序是一个将要取代遗留系统的应用程序。遗留代码将被关闭,并在某个时候不再使用。一旦那个时间点到来,我不想返回并更改任何代码(如果可能的话)。
下面是一个虚构的概念性例子,伪装成我的意思:
NewSystemEmployee.Save(Employee e)
if (Legacy System Is Running)
{
LegacySystemEmployee.Save(Employee e)
}
NewSystemEmployee.Save
方法始终需要执行。只要遗留系统正在运行,我只想执行 LegacySystemEmployee.Save
。 Legacy 系统关闭后,我不想再执行 LegacySystemEmployee.Save
一旦遗留系统消失,我不知道如何在没有遗留系统的情况下完成我想要的:
- 在调用
LegacySystemEmployee.Save
之前创建 IF 语句或 - 删除对
LegacySystemEmployee.Save
方法的所有调用或 - 更改
LegacySystemEmployee.Save
方法,使其成为一个 stub ,仅此而已
我还要求 NewSystemEmployee
类不以任何方式引用 LegacySystemEmployee
类。
有什么建议吗?
非常感谢
最佳答案
乍一看,这需要 Strategy pattern (或者实际上 Template Method ),可能带有 Factory Method来控制使用哪种策略。示例(在伪 Java 中):
class Saver {
protected void LegacySave(Employee e) {}
public final void Save(Employee e) {
NewSystemEmployee.Save(e);
LegacySave(e);
}
}
class LegacySaver extends Saver {
protected void LegacySave(Employee e) {
LegacySystemEmployee.Save(e);
}
}
由于在某个时间点您将不再需要遗留调用,因此将默认的 LegacySave
实现为空是有意义的。然后你可以像这样简单地使用这个类:
getSaver().save(employee);
其中 getSaver()
是工厂方法,它默默地决定将哪个 Saver
实现呈现给它的调用者。简单地说,它可以从配置文件中获取类名。
问题是,您需要如何更改行为:运行时,还是通过重新启动应用程序?如果您可以重新启动应用程序,则很容易更改配置中控制要使用的策略的那一行。即时更改行为稍微有点棘手,但可行。
很大程度上取决于您使用的编程语言。例如。在 Java/C++/C# 中,你可以使用 dependency injection 轻松完成你想要的。 ;在其他一些语言中,这可能不是那么容易。
关于design-patterns - 我应该使用什么设计模式来完成下面的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281412/