我应该使用什么样的设计模式来完成下面的任务

mik*_*ner 2 design-patterns

我需要能够有条件地执行一个方法.我希望在我的代码中没有一堆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

遗留系统消失后,我不知道如何在没有遗传的情况下完成我想要的东西:

  1. 在调用LegacySystemEmployee.SaveOR 之前创建IF语句
  2. 删除对LegacySystemEmployee.Save方法OR的每次调用
  3. 更改LegacySystemEmployee.Save方法,使其成为存根,仅此而已

我还要求该NewSystemEmployee课程不以任何方式提及该LegacySystemEmployee课程.

有什么建议?

非常感谢

Pét*_*rök 6

乍一看,这需要策略模式(或实际上是模板方法),可能使用工厂方法来控制要使用的策略.示例(伪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#中,您可以通过依赖注入轻松完成所需的操作; 在其他一些语言中,它可能并不那么容易.