我需要能够有条件地执行一个方法.我希望在我的代码中没有一堆IF语句有几个原因,最值得注意的是,在将来的某个时刻,该方法将不再使用.
我不确定这样做的最佳方式或我应该选择哪种模式来完成这项任务.
我所指的应用程序是一个将取代遗留系统的应用程序.遗留代码将被关闭,并且在某些时候不再使用.一旦这个时间点到来,我不想回去更改任何代码(如果可能的话).
以下是我所说的psuedo中的一个虚构的概念示例:
NewSystemEmployee.Save(Employee e)
if (Legacy System Is Running)
{
LegacySystemEmployee.Save(Employee e)
}
Run Code Online (Sandbox Code Playgroud)
该方法NewSystemEmployee.Save总是需要执行.我只想LegacySystemEmployee.Save在Legacy系统运行时执行.Legacy系统关闭后,我不想再执行了LegacySystemEmployee.Save
遗留系统消失后,我不知道如何在没有遗传的情况下完成我想要的东西:
LegacySystemEmployee.SaveOR 之前创建IF语句LegacySystemEmployee.Save方法OR的每次调用LegacySystemEmployee.Save方法,使其成为存根,仅此而已我还要求该NewSystemEmployee课程不以任何方式提及该LegacySystemEmployee课程.
有什么建议?
非常感谢
乍一看,这需要策略模式(或实际上是模板方法),可能使用工厂方法来控制要使用的策略.示例(伪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);
}
}
Run Code Online (Sandbox Code Playgroud)
由于在某个时间点您将不再需要旧调用,因此将默认值实现LegacySave为空是有意义的.然后你可以像这样平凡地使用这个类:
getSaver().save(employee);
Run Code Online (Sandbox Code Playgroud)
getSaver()工厂方法在哪里静默地决定Saver向其调用者呈现哪个实现.平凡地,它可以从配置文件中获取类名.
问题是,您如何更改行为:运行时,还是重新启动应用程序?如果您可以重新启动应用程序,则可以轻松更改配置中控制要使用的策略的那一行.在运行中改变行为稍微有点棘手,但可行.
很大程度上取决于您使用的编程语言.例如,在Java/C++/C#中,您可以通过依赖注入轻松完成所需的操作; 在其他一些语言中,它可能并不那么容易.