我有一个7-8的用例。示例用例:
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梯子?
发布于 2015-10-08 17:03:37
如果你真的想在这种情况下使用设计模式,我建议使用Visitor Pattern。这是(据我所知)最适合这种“类型检查”的方法。您可以找到一个很好的示例here。但正如alreday在评论中所说的那样,我同意在这种情况下,模式将是很大的开销。
发布于 2015-10-09 14:27:21
为所有任务引入一个接口,并使用工厂模式。工厂可以在内部使用地图。例如。
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
}发布于 2015-10-08 17:03:10
工厂实现可能如下所示:
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 {
}
}https://stackoverflow.com/questions/33010710
复制相似问题