设计应用程序和GUI之间的接口

时间:2009-05-13 13:30:54

标签: java

对于家庭作业,我需要构建一个小型Java应用程序。主要目标是学习如何与XML交互。但第二个目标是学习如何构建这样的应用程序。

我在编程方面有很多经验,但在设计程序方面经验不多。  我读过有关Designpatterns和Designprinciples的信息,比如Solid和TDD。但我发现很难知道如何实现这些想法。

我遇到的一个问题是GUI和应用程序之间的隔离。在应用程序上,我们希望能够根据不同的标准进行排序。对于每个条件,都会有一个按钮(如列表的标题)。这将导致触发事件。但是,我应该如何传递应该排序的标准,以及如何发回已排序的数据?

可以为每个按钮定义不同的事件,但是您可能会有几个类似的事件,唯一的目标是区分排序标准。

另一种方法是定义一个事件,然后传递一个字符串或int,它将指定应该排序的标准,但是你会得到if else语句的列表,并且不会遵循open open原理

你将如何设计这样一个系统。

修改

我最关心的是试图让这个'开 - 关'。有人问,数据是一组对象。有没有什么方法可以轻松添加排序标准?或者这不是真的可行吗?

9 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你需要单独的GUI和应用程序逻辑。

了解MVC模式。 http://en.wikipedia.org/wiki/MVC

对你来说可能更好的是MVP模式 http://en.wikipedia.org/wiki/Model_View_Presenter

如果您有使用MVC模式的经验,请查看某些用于桌面应用程序的Java MVC Framework(主要用于Web)。

答案 1 :(得分:2)

听起来有点像你的数据会显示在表格中,如果你使用Swing,JTable现在支持排序。查看Sun的Swing trail中的JTable tutorial

我会说作为一般解决方案,您可能会将标准作为参数传递给任何排序。

另一个建议是不要过分担心模式,只需保持设计简单和代码可读,您就可以使用小型应用程序。有时很容易陷入所有漂亮的模式,然后尝试将它们挤进你的应用程序。

答案 2 :(得分:1)

您也可以查看Observer Pattern

有关实际实施,请参阅this文章。

答案 3 :(得分:1)

很高兴看到你正在考虑这个问题,这可以说是一个不幸的开发者比例。

你当然应该关注MVC等设计模式。我个人最喜欢的是MVVM模式。如果你谷歌它,你通常会发现它链接到WPF应用程序,但没有理由它不能应用于更广泛的平台(毕竟它只是一个设计模式)。我更喜欢将“视图”视为外部接口而不是GUI。

答案 4 :(得分:1)

最好的方法是“一个事件,然后传递一个字符串或int”。

根据您使用的基础数据结构,您不需要使用switch语句对数据进行排序。如果您有数据表,则可以使用该字符串指定要排序的列。如果你有一组对象并且列代表它们的属性,那就太棘手了。在.Net中,您可以使用LINQ做一些简洁的事情,让您按表示为字符串的属性进行排序。但是在java中,你总是可以使用反射来获取字段值以进行排序。

如果您将数据表示为多维数组,则传递int将表示要排序的数组的property-y索引。在任何情况下,始终存在一种可用于避免switch语句进行排序的技术。

答案 5 :(得分:0)

如果你传递了一个int,它对应于你想要排序的列号,你就不需要case语句(或一堆“if”语句),你可以只索引该列。

答案 6 :(得分:0)

将GUI的表示与GUI的逻辑分开。然后你可以使用TDD来创建逻辑层,而表示层将只是逻辑层和GUI框架之间的简单粘合代码。

请点击此页面上的链接获取更多信息:http://martinfowler.com/eaaDev/ModelViewPresenter.html

答案 7 :(得分:0)

查看GlazedLists进行过滤/排序等。对列表进行操作,以及JavaBuilders以便在YAML文件中声明GUI元素的简单方法。 (第一个几乎是必要的,第二个是方便的)

我过去常常避免GUI开发,因为它要么很痛苦,要么我需要使用一些hokey图形工具来设计一个以我不理解的方式工作的GUI。但是上面的工具包使用起来非常简单,让我把精力集中在我的程序实际上在做什么而不是如何显示它。

答案 8 :(得分:0)

“可以为每个按钮定义不同的事件,但之后您会有几个类似的事件,唯一的目标是区分排序标准。”

我实际上会使用命令模式,使用它一个对象(通常称为Action)会封装调用方法所需的所有信息(Receiver of Action)。

有些事情:

public enum CommandType{ 
    SORT_BY_CRITERIA_1, 
    SORT_BY_CRITERIA_2, 
    SORT_BY_CRITERIA_3; 
}

public interface Command{
     public CommandType getCommandType();
     // Any other information you need to pass to the receiver
}

public class CriteriaOneCommand implements Command{
       private final CommandType commandType;

       public CriteriaOneCommand(){
           commandType = SORT_BY_CRITERIA_1;
       }

       public CommandType getCommandType(){
           return commandType;
       }
}

接收机

public void action(Command command){
       CommandType type = command.getCommandType();

       // If type is criteria 1, sort using that criteria
       // If type is criteria 2, sort using that criteria
}

即使您决定使用一个事件,也可以使用enum而不是使用int / String来区分不同类型的事件。