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

标签 design-patterns

我需要能够有条件地执行一个方法。出于多种原因,我不喜欢在我的代码中使用一堆 IF 语句,最值得注意的是在将来的某个时间点将不再使用该方法。

我不确定执行此操作的最佳方法或我应该选择哪种模式来完成此任务。

我指的应用程序是一个将要取代遗留系统的应用程序。遗留代码将被关闭,并在某个时候不再使用。一旦那个时间点到来,我不想返回并更改任何代码(如果可能的话)。

下面是一个虚构的概念性例子,伪装成我的意思:

NewSystemEmployee.Save(Employee e)

if (Legacy System Is Running)
{
    LegacySystemEmployee.Save(Employee e)
}

NewSystemEmployee.Save 方法始终需要执行。只要遗留系统正在运行,我只想执行 LegacySystemEmployee.Save。 Legacy 系统关闭后,我不想再执行 LegacySystemEmployee.Save

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

  1. 在调用 LegacySystemEmployee.Save 之前创建 IF 语句或
  2. 删除对 LegacySystemEmployee.Save 方法的所有调用或
  3. 更改 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/

相关文章:

c++ - 用于将 cython 中的许多 c++ 类包装到单个共享对象的项目结构

bash - 如何在引用的表达式中转义扩展路径名扩展模式?

java - Chain of Rep. 合适与否

c++ - 我应该使用什么设计模式来避免此处出现伪代码?

asp.net-mvc - MVC Controller 中重构和处理非异常错误的设计模式

c# - C# 中的静态类

java - OOP 设计 - 需要准备每个方法调用并在之后清理

java - Android AsyncTask/doInBackground 模式

c# - 以不会成为 "God object"的方式设计类

java - Java中的单例和继承