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

时间:2015-10-08 08:39:57

标签: java design-patterns

我有一个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梯形图?

4 个答案:

答案 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)

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

  1. 工厂模式 - 制作 BaseClass 。 A,B(和C ......)类应扩展此BaseClass。 BaseClass应该有一个抽象方法performTask(),它应该由A类和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和2中定义的3个方法。 3。

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

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