我有一个7-8的用例if else。示例用例:
String type;
List < Entity > entityList;
if (type.equals("A")) {
ClassA a = new ClassA();
a.performTask();
for (Entity e: entitylist) {
// do some task
}
}
else if (type.equals("B")) {
ClassB b = new ClassB();
b.performTask();
for (Entity e: entitylist) {
// do some different task
}
}
在这种情况下,哪种java设计模式最适合我想要消除这个if else梯形图?
答案 0 :(得分:1)
如果您真的想在这种情况下使用设计模式,我建议使用Visitor Pattern。这是(据我所知)最适合这种&#34;类型检查&#34;的那个。你可以找到一个很好的例子here。但正如alreday在评论中指出的那样,我同意在这种情况下,模式会有很多开销。
答案 1 :(得分:1)
为所有任务引入界面并使用工厂模式。工厂可以在内部使用地图。 E.g。
public class TaskFactory {
private Map<String, Class<? extends Task>> taskTypeMap = new HashMap<String, Class<? extends Task>>();
public TaskFactory() {
taskTypeMap.put("A", ATask.class);
taskTypeMap.put("B", BTask.class);
}
public Task createTask(String type) {
Class<? extends Task> taskType = taskTypeMap.get(type);
if (taskType == null) {
throw new IllegalArgumentException("Task type " + type
+ " is not supported");
}
try {
return taskType.newInstance();
} catch (Exception e) {
throw new IllegalStateException(
"Unable to instantiate Task of type " + taskType, e);
}
}
}
您的客户端代码将更改为
String type = ...;
List<Entity> entityList = ...;
TaskFactory taskFactory = new TaskFactory();
Task task = taskFactory.createTask(type);
task.performTask();
for (Entity e: entitylist) {
// do some task
}
答案 2 :(得分:0)
工厂实施可能如下所示:
public class WidgetFactory {
public static void main(String[] args) {
String type = "A";
List<Entity> entityList = new ArrayList<>();
Widget widget = WidgetFactory.createWidget(type);
widget.performTask();
for (Entity e : entityList) {
widget.performTaskOnEntity(e);
}
}
private static Widget createWidget(String type) {
switch (type) {
case "A":
return new ClassA();
case "B":
return new ClassB();
default:
throw new IllegalArgumentException("Unknown type: " + type);
}
}
private interface Widget {
void performTask();
void performTaskOnEntity(Entity entity);
}
private static class ClassA implements Widget {
public void performTask() { }
public void performTaskOnEntity(Entity entity) { }
}
private static class ClassB implements Widget {
public void performTask() { }
public void performTaskOnEntity(Entity entity) { }
}
private static class Entity {
}
}
答案 3 :(得分:0)
您需要以下模式才能使此设计成为通用的 -
模板模式 - 让我们为模板定义基类 - BaseTemplateClass 。现在,我在这里使用模板模式的原因是你在这里有3个不同的步骤 -
步骤1 - 创建BaseClass的新实例(我们将使用步骤1中定义的Factory来执行此操作)。 CreateInstance()将是TemplateBaseClass中的第一个具体方法,它将接受字符串参数标识符并调用工厂。因为,这是一个固定的步骤,我们将CreateInstance()作为具体方法。
第2步 - 将调用BaseClass的performTask()。这将是抽象的。
第3步 - processEntityList()方法将包含for循环。这也是一个包含对for循环的调用的具体方法 - for(Entity e:entitylist){..}
最后,我们在BaseTemplateClass中需要一个方法execute(),它调用步骤1,2和2中定义的3个方法。 3。
BaseTemplateClass的实现将只根据需要实现抽象方法performTask() - 在这种情况下只调用A,B(或C ...)的performtask()。但如果需要用A,B(或C ......)做更多的事情,这将有所帮助。
客户端(用经典术语)只需要调用适当的BaseTemplateClass实现的实例的execute()方法,其余的将按照上面的设计进行。