【发布时间】:2016-06-21 20:25:36
【问题描述】:
我有不同的类类型,并且根据某些条件,我想委托给可以处理这些类类型的适当service。
示例: 我有几个类如下。
class Student;
class Prof;
...
每个类都有一个服务,实现:
interface IPersonService {
void run();
}
我有一个mode,它是通过某些条件找到的:
enum PersonType {
STUDENT, PROF;
}
当我委托时:
@Autowired
private StudentService studentService;
@Autowired
private ProfService profService;
//@param mode assume known
public void delegate(PersonType mode) {
//assume there are several of those switch statements in my business code
switch (mode) {
case STUDENT: studentService.run(); break;
case PROF: profService.run(); break;
default: break;
}
}
问题:当引入额外的类时,我必须同时修改PersonType并添加一个额外的枚举(这没问题),但我还必须扩展任何switch语句和添加对其他委托服务的调用。此外,我必须将这些服务显式自动连接到 switch 委托人。
问题:我如何优化这段代码,只为任何额外的类实现新的服务,而不必触及任何 switch 语句?
【问题讨论】:
-
您可以在枚举本身中保留一个映射以将 PersonType 与服务相关联,并且在委托中只需根据 PersonType 获取服务并调用它。
-
但是我不能将服务注入枚举,可以吗?
-
问题的根源在于服务逻辑与其服务的数据是分离的。分离数据和逻辑称为Procedural Programming。在Object Oriented Programming 中,服务逻辑与其服务的数据相结合,因此无需“委托”。
-
@jaco0646 您将如何重写或改进给出的示例?
-
我不会对重写代码感兴趣。我想指出,目前的答案是针对程序问题的程序解决方案,而根据我的经验,java 设计模式始终是面向对象的。
标签: java design-patterns