【发布时间】:2018-07-28 03:09:12
【问题描述】:
我知道已经有类似的问题,但是看着它们我仍然对如何设计我的代码有一些疑问。我有一项服务允许User 注册/登录/更新/删除。问题是 User 是一个抽象类型,它包含数据 typeOfUser,基于该数据应该调用实际的 registration / update / delete 方法,现在我在switch-case 块。我想用更好的设计来代替它。
UserController.java
public class UserController {
public UserDto register(UserDto user) {
switch(user.getTypeOfUser()) {
case DRIVER: return driverService.register(user);
case CUSTOMER: return customerService.register(user);
// ...
}
}
public UserDto update(UserDto user) {
switch(user.getTypeOfUser) {
case DRIVER: return driverService.update((DriverDto) user);
case CUSTOMER: return customerService.update((CustomerDto) user);
// ...
}
}
public UserDto login(long userId) {
loginService.login(userId);
UserBO user = userService.readById(userId);
switch(user.getTypeOfUser) {
case DRIVER: return DriverDto.fromBO((DriverBO) user);
case CUSTOMER: return CustomerDto.fromBO((CustomerBO) user);
// ...
}
}
// ...
}
我知道可以使用Visitor 之类的模式,但我真的需要在Enum 本身中添加注册/登录/更新/删除的方法吗?我真的不清楚如何做到这一点,感谢任何帮助。
【问题讨论】:
-
诀窍是有一个单一的通用服务,然后只需调用一次用户作为输入,即调用一次
service.register(user),而不是使用switch语句。 -
@TimBiegeleisen 是的,但是您将如何实现“更新(用户)”?因为更新适用于客户端或驱动程序特定字段。所以它不能真正使用通用服务,它必须使用特定的。
-
我指出了多态性可以帮助您的一种方式。您可能在某处需要这样的 switch 语句,尽管它不必在这里。
-
@wesleyy
Visitor模式解决了一个非常具体的问题,并且在大多数情况下(如果不是全部)几乎总是矫枉过正。请参阅我的答案,了解用简单的 Polymorhism.. 解决这个问题的方法
标签: java design-patterns polymorphism visitor-pattern