首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >哪种Java设计模式最适合包含循环的if-else语句?

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

Stack Overflow用户
提问于 2015-10-08 16:39:57
回答 4查看 504关注 0票数 1

我有一个7-8的用例。示例用例:

代码语言:javascript
运行
复制
 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梯子?

EN

回答 4

Stack Overflow用户

发布于 2015-10-08 17:03:37

如果你真的想在这种情况下使用设计模式,我建议使用Visitor Pattern。这是(据我所知)最适合这种“类型检查”的方法。您可以找到一个很好的示例here。但正如alreday在评论中所说的那样,我同意在这种情况下,模式将是很大的开销。

票数 1
EN

Stack Overflow用户

发布于 2015-10-09 14:27:21

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

代码语言:javascript
运行
复制
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);
        }
    }

}

然后,您的客户端代码将更改为

代码语言:javascript
运行
复制
String type = ...;
List<Entity> entityList = ...;

TaskFactory taskFactory = new TaskFactory();
Task task = taskFactory.createTask(type);

task.performTask();

for (Entity e: entitylist) {
    // do some task
}
票数 1
EN

Stack Overflow用户

发布于 2015-10-08 17:03:10

工厂实现可能如下所示:

代码语言:javascript
运行
复制
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 {
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33010710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档