每日一图(第一天);也是我的第一篇帖子
为什么?
设计模式并非我的强项,当然,为了进步,我们必须不断学习。它不会完美,所以欢迎您的批评指正。
今天的问题是什么?
最近我有机会观摩了另一位开发人员的工作。他正在编写一个与特定 API 通信的应用程序。该 API 最近进行了更新,高层管理人员希望应用程序能够根据部署配置与两个版本进行通信。
开发者是如何解决这个问题的?
开发人员使用if应用程序中每个路由下的控制结构来执行 API 三个版本的相应代码。
对这种方法是否存在感知到的问题?
- 冗长且臃肿的功能
- 难以理解的代码
- 每条路径下的抽象层级过多
我的想法?
在我看来,问题在于如何选择 API 版本并据此创建相应的 API 实例。这似乎属于类实例化和对象创建范畴。
我是如何做到的(至少是实例化部分)?
- 创建定义 API 的接口
- 是否有任何版本实现了它
- 创建一个工厂,根据给定的版本创建相应的实例。
所以,代码大概是这样的(可能有些错误,不用在意):
界面:
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