为我的java项目选择设计模式时出现问题

时间:2010-02-14 07:39:39

标签: java swing

我正在开发一个Java桌面应用程序。在Swing GUI中,用户通过5个复选框输入5个输入,如下所示:

CheckBox1: Scrape Name

CheckBox2: Scrape地址

CheckBox3:抓电话号码

CheckBox4: Scrape State

CheckBox5: Scrape Country

我已经为每个复选框创建了5个函数。

public static String getName(String pageContent) {
    ...
}

public static String getAddress(String pageContent) {
    ...
}

:
:

现在,我编写了一个代码,根据用户的输入调用这些函数。 E.g。

public static void main(String [] args) {

    List<String> list = new ArrayList<String>();

    ...
    code to populate the list
    ...

    String name = null;
    String address = null;
    String phone = null;
    String state = null;
    String country = null;


    for(String pageContent : list) {

        if(CheckBox1.isSelected()) {
            name = getName(pageContent);
        }

        if(CheckBox2.isSelected()) {
            address = getAddress(pageContent);
        }

        ...
        similar code for the remaining 3 methods
        ...
        code to store the data in variables (name, address...) in the database
        ...
    }
}

现在,实际上checkBox的数量大约为20,用户可以选择保存其配置,这样他就不需要一次又一次地选择他的选择以进行后续的抓取。他只是加载配置(存储在.xml文件中)并开始抓取。

所以,我的问题如下:

Q1。 list可以包含1000s个字符串,因此会检查20条件(如果for循环中有块,则为20个)每次都会有1000 * 20 comparisions来刮掉1000个字符串。上述方法(在代码中显示)是否正确?

4 个答案:

答案 0 :(得分:0)

有一件事看起来不对,就是你if循环中的多个for语句,以及保存抓取数据的唯一变量。这意味着如果您的方法检索多个pageContent的值,则会写入变量并丢失先前的值。

这就是你想要的吗?如果没有,您应该重构for循环和if语句,可能只需将整个列表传递给getNamegetAddress等方法,或其他方法但是,你的代码应该如何运作并不完全清楚。根据数据的样子,可能可以通过对列表进行排序来优化代码......

答案 1 :(得分:0)

您认为目前的设计有什么不妥或笨拙的吗?

我认为现在还不清楚这可能是什么设计模式,如果有的话。有一件事对我来说不清楚,刮削过程的期望输出究竟是什么?

那就是说,这是我的2美分: 1000 * 20的比较很可能并不意味着任何表现明智。您可以重新构造代码,以便仅使用多态对象或其他内容进行一次检查,但这很可能会过于复杂。或许类似于战略模式的东西。我不会这样做。

然而,我会创建一个非常简单的'scraper'类,它包含与for-loop完全相同的代码,但选择是用布尔值等设置的。然后有一个单独的方法从gui或xml文件创建一个scraper对象。如果需要,你可以从那里进一步重构。

答案 2 :(得分:0)

对于一个非常简单的应用程序来说,为整个应用程序框架选择一个经典的设计模式可能更像是一个学术练习而不是其他任何东西。这样的设计模式可能会使程序过于复杂。实际上,您采用的方法适用于小型应用。可读性的一个改进是在for循环中方法化过程。

也就是说,从您的示例中可以看出,您正在main方法中测试复选框的状态。我希望这个代码驻留在像actionPerformed(继承自ActionListener接口)的方法中,或者一些类似的Observer,它会对Swing事件作出反应。我建议一个GUI设计,提供一个触发操作的按钮,你的应用程序将注册为ActionListener。这将允许用户选择适用于其查询的复选框,然后触发该操作。在actionPerformed方法中,您可以移动触发器以开始解析页面内容。您将需要警惕threading constraints that Swing provides,并将数据库调用移动到工作线程。如果您还不熟悉,请查看SwingWorker

答案 3 :(得分:-1)

几乎没有人能告诉你哪种设计模式适合你的问题。我建议你,只研究那些你认为适合你的问题的设计模式。你发现不止一个设计可以解决你的问题。只需实现它们,编写代码然后再次研究您的需求。再次使用其他设计模式并实现它。最终,您将以正确的设计结束。这是您学习设计模式和它们之间差异的方式,这将有助于您将来选择正确的设计。 设计模式是GOF建议的现成解决方案,它们不能直接解决任何问题。他们只是给你正确的方向。