发布于 2026-01-06 0 阅读
0

每日一图(第一天);也是我的第一篇帖子

每日一图(第一天);也是我的第一篇帖子

为什么?

设计模式并非我的强项,当然,为了进步,我们必须不断学习。它不会完美,所以欢迎您的批评指正。

今天的问题是什么?

最近我有机会观摩了另一位开发人员的工作。他正在编写一个与特定 API 通信的应用程序。该 API 最近进行了更新,高层管理人员希望应用程序能够根据部署配置与两个版本进行通信。

开发者是如何解决这个问题的?

开发人员使用if应用程序中每个路由下的控制结构来执行 API 三个版本的相应代码。

对这种方法是否存在感知到的问题?

  1. 冗长且臃肿的功能
  2. 难以理解的代码
  3. 每条路径下的抽象层级过多

我的想法?

在我看来,问题在于如何选择 API 版本并据此创建相应的 API 实例。这似乎属于类实例化和对象创建范畴。

我是如何做到的(至少是实例化部分)?

  1. 创建定义 API 的接口
  2. 是否有任何版本实现了它
  3. 创建一个工厂,根据给定的版本创建相应的实例。

所以,代码大概是这样的(可能有些错误,不用在意):

界面:

  public interface API
  {
    public void doSomething();
    public void doOneMoreThing();
  }

API实例:

  public class ApiV1 implements API
  {
    public void doSomething()
    {
      // doing something
    }

    public void doOneMoreThing()
    {
      // doing one more thing
    }
  }

  public class ApiV2 implements API
  {
    public void doSomething()
    {
      // doing something but slightly differently
    }

    public void doOneMoreThing()
    {
      // doing one more thing but slightly differently
    }
  }

工厂:

  public class APIFactory
  {
    private Map<String, API> apiMap =  Map.ofEntries(entry("v1", ApiV1),
                                                     entry("v2", ApiV2));

    public API getApiIstance (string version)
    {
      if (!this.apiMap.containsKey(version)) {
        throw new IllegalArgumentException("Passed API version does not exist.");
      }
      return this.apiMap.get(version)();
    }
  }

用法:

  // assuming there is a config somewhere
  API apiv1 = APIFactory().getApiInstance(config.apiVersion);

结论:

嗯,是的。虽然不完美,但或许是朝着正确方向迈出的一步。

文章来源:https://dev.to/danielmwakanema/one-design-pattern-per-day-day-1-also-first-post-3480