繁体   English   中英

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

[英]Problem in choosing a design pattern for my java project

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

CheckBox1:抓取名称

CheckBox2:抓取地址

CheckBox3:刮擦电话号码

CheckBox4: Scrape状态

CheckBox5: Scrape国家

我已经做了5个功能,每个复选框都有一个。

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

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

:
:

现在,我已经编写了一个根据用户输入调用这些函数的代码。 例如

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
        ...
    }
}

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

因此,我的问题如下:

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

看起来不对的一件事是,您的for循环内有多个if语句,以及用于保存已抓取数据的唯一变量。 这意味着,如果您的方法检索到多个pageContent的值,则变量将被覆盖,而先前的值将丢失。

那是你要的吗? 如果不是,则应该重构for循环和if语句,也许只是通过将整个列表传递给getNamegetAddress等方法,或其他方式进行重构,但尚不清楚代码应如何工作。 根据数据的样子,可以通过对列表进行排序来优化代码。

您认为当前设计有什么错误或笨拙吗?

我认为目前尚不清楚该考虑哪种设计模式。 我不清楚一件事,刮取过程的期望输出到底是什么?

就是说,这是我的2美分:1000 * 20的比较很可能对性能没有任何意义。 您可以重组代码,以便对多态对象或某些对象仅进行一次检查,但这极有可能使方法过于复杂。 也许类似于策略模式。 我还不会做。

但是,我将创建一个非常简单的“ scraper”类,该类包含与for循环中完全相同的代码,但是选择是通过布尔值或其他方式设置的。 然后有一个单独的方法从gui或xml文件创建一个scraper对象。 如果需要,您可以从那里进一步重构。

对于您看来非常简单的应用程序,为整个应用程序框架选择经典的设计模式可能比其他任何事情都更加学术化。 这种设计模式可能会使程序过于复杂。 实际上,您所采用的方法适用于小型应用。 可读性的一项改进是在for循环中对过程进行方法化。

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

几乎没有人可以告诉您哪种设计模式适合您的问题。 我建议您只研究那些您认为适合您的问题的设计模式。 您发现一个以上的设计可以解决您的问题。 只需实施它们,编写代码,然后再研究您的要求。 再次采用其他设计模式并实施。 最终,您将获得正确的设计。 通过这种方法,您可以了解设计模式以及它们之间的区别,这将帮助您将来选择正确的设计。 设计模式是GOF建议的现成解决方案,它们不能直接解决任何问题。 他们只是给您正确的方向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM