哪种Java设计模式最适合包含循环的if-else语句?

如果没有,我有7-8的用例。 示例用例:

String type; List  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梯形图?

如果您真的想在这种情况下使用设计模式,我会建议访问者模式 。 这是(据我所知)最适合这种“类型检查”的那个。 你可以在这里找到一个很好的例子。 但正如alreday在评论中指出的那样,我同意在这种情况下,模式会有很多开销。

为所有任务引入接口并使用工厂模式。 工厂可以在内部使用地图。 例如

 public class TaskFactory { private Map> taskTypeMap = new HashMap>(); public TaskFactory() { taskTypeMap.put("A", ATask.class); taskTypeMap.put("B", BTask.class); } public Task createTask(String type) { Class 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 entityList = ...; TaskFactory taskFactory = new TaskFactory(); Task task = taskFactory.createTask(type); task.performTask(); for (Entity e: entitylist) { // do some task } 

工厂实现可能如下所示:

 public class WidgetFactory { public static void main(String[] args) { String type = "A"; List 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 { } } 

您需要以下模式才能使此设计成为通用的 –

  1. 工厂模式 – 制作一个BaseClass 。 A,B(和C ……)类应扩展此BaseClass。 BaseClass应该有一个抽象方法performTask(),它应该由A类和B类(和C …)实现,以使它们具体实现
  2. 模板模式 – 让我们为模板定义基类–BaseTemplateClass 。 现在,我在这里使用模板模式的原因是你在这里有3个不同的步骤 –

    步骤1 – 创建BaseClass的新实例(我们将使用步骤1中定义的Factory来执行此操作)。 CreateInstance()将是TemplateBaseClass中的第一个具体方法,它将接受字符串参数标识符并调用工厂。 因为,这是一个固定的步骤,我们将CreateInstance()作为具体方法。

    第2步 – 将调用BaseClass的performTask()。 这将是抽象的。

    第3步 – processEntityList()方法将包含for循环。 这也是一个包含对for循环的调用的具体方法 – for(Entity e:entitylist){..}

    最后 ,我们需要BaseTemplateClass中的方法execute(),它调用步骤1,2和3中定义的3个方法。

BaseTemplateClass的实现将只根据需要实现抽象方法performTask() – 在这种情况下只调用A,B(或C …)的performtask()。 但如果需要用A,B(或C ……)做更多的事情,这将会有所帮助。

客户端(用经典术语)只需要调用BaseTemplateClass的合适实现的实例的execute()方法,其余的将按照上面的设计进行。