这个问题的创造性设计模式?

时间:2011-08-17 14:24:46

标签: java design-patterns

我有以下伪代码说明的以下问题(可能没有多大意义):

class Form {
    boolean loggedOn = false;
    String id = null;
    ...get/set shared methods
}

class SearchFormA extends Form{
    String name = null;
    String email = null;

    ...get/set methods
}

class SearchFormB extends Form{
    String age = null;
    String gender = null;

    ...get/set methods
}

class Search {
    public Search(HttpServletRequest request){
            String searchMode = (String) request.getSearchMode();
        if("0".equals(searchMode)){
            SearchFormA formA = new SearchFormA();
            formA.setName((String)request.getParameter("name"));
            formA.setId((String)request.getParameter("id"));
            ...populate form
            request.getSession().setAttribute("formA",formA);
        }

        if("1".equals(searchMode)){
            SearchFormB formB = new SearchFormB();
            formB.setAge((String)request.getParameter("age"));
            formB.setId((String)request.getParameter("id"));
            ...populate form
            request.getSession().setAttribute("formB",formB);
        }

        ...rest of code
    }
}

我所做的是使用反射,但是在编译时还有其他方法吗? 我也尝试过Factory方法,但是SearchFormA和SearchFormB这两个类没有多少共同之处。

编辑:好的,基本上,在这种情况下,我有4-5个searchModes,每个searchMode都有不同的形式。在这些形式之间,它们共享某些类似的领将来我可能需要添加10个searchModes,它会重复填充相同的字段。

3 个答案:

答案 0 :(得分:2)

不幸的是,你的代码太过“伪”。例如,您不清楚从哪里开始searchMode。此外,您的特定表单的初始化也是硬编码的。我相信在现实生活中,所有这些数据都来自班级Data

所以,我假设类Data包含name,age,id。现在的问题是Data类如何包含这些数据。特殊领域?通用哈希表?

在任何情况下,我认为你有某种“通用”代码(搜索类)并且必须创建特殊形式这一事实是一种糟糕的模式。您应该使用一些自动填充特定表单的MVC框架。然后使用表单数据运行搜索逻辑。如果你有两种模式的共享逻辑,则在抽象类或实用程序类中实现它。

答案 1 :(得分:1)

我认为你目前的方法没有太大问题。您可以使用枚举来避免字符串比较,如下例所示:

public enum SearchMode {
    A {
        @Override
        public Form createForm(Data data) {
            SearchFormA form = new SearchFormA();
            form.setName(...);
            populateCommon(form, data);
            return form;
        }
    },
    B {
        @Override
        public Form createForm(Data data) {
            SearchFormB form = new SearchFormB();
            form.setAge(...);
            populateCommon(form, data);
            return form;
        }
    };

    public abstract Form createForm(Data data);

    public void populateCommon(Form form, Data data) {
        // Set common properties
        form.setId(...);
    }

    public static Form createForm(String searchMode, Data data) {
        return SearchMode.valueOf(searchMode).createForm(data);
    }
}

答案 2 :(得分:0)

您显然要避免的是,在搜索方法中,您必须继续追加if结构(意大利面条代码)。

我觉得你所描述的情况与我为this answer所写的情况没有什么不同。这意味着战略和模板(以及其他)可以派上用场。

干杯, 维姆