【发布时间】:2021-05-28 18:17:45
【问题描述】:
我不太确定这个用例叫什么,但让我解释一下:我正在开发一个上传数据的服务。我的服务处理不同类型的上传,并且每种上传类型都是唯一的,例如UPLOAD_A 的内容!= UPLOAD_B 的内容。
我收到的数据是一个 json 文件。从 json 文件中,我知道它是什么类型的上传。我需要将此 json 解析为适当的 UploadDataX 对象。例如,如果我得到一个 UPLOAD_A 的 json 数据文件,我需要将它序列化为一个 UploadDataA 对象。
拥有UploadDataX 对象后,我需要上传数据。我通过使用外部客户端对象来做到这一点:UploadClient()。但是,我需要根据数据类型调用特定的上传方法。例如,对于UPLOAD_A 类型,我需要调用UploadClient().uploadDataA(UploadDataA),对于UPLOAD_B 类型,我需要调用UploadClient().uploadDataB(uploadDataB)。
问题是我不拥有这些UploadDataX 和客户端对象中的任何一个。不幸的是,UploadDataX 不属于超类。我想知道处理这个用例的有效设计模式是什么?
我可以想到一个蛮力解决方案,使用简单的 switch-case 语句:
// BRUTE FORCE SOLUTION
public void upload(UploadType uploadType, String jsonString) {
switch (uploadType) {
case UPLOAD_A: {
UploadDataA uploadDataA = Gson().fromJson(jsonString, UploadDataA.class);
UploadClient().uploadDataA(uploadDataA);
break;
}
case UPLOAD_B: {
UploadDataB uploadDataB = Gson().fromJson(jsonString, UploadDataB.class);
UploadClient().uploadDataB(uploadDataB);
break;
}
}
...
}
如您所见,这似乎是重复的,我不禁觉得有更好的设计方法。我在考虑工厂模式,但我想看看其他人的想法。
【问题讨论】:
-
你需要的是一个简单的多态性:) 如果你有一个
UploadType,让它成为一个单一方法upload(json)的接口。然后你可以有不同的实现:UplaodA implements UploadType等,每个upload()方法都会有来自你上面的 switch arm 的相应 impl :)
标签: java design-patterns