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

Java 设计应用程序和GUI之间的接口,java,Java,作为家庭作业,我需要构建一个小型java应用程序。主要目标是学习如何与XML交互。但第二个目标是学习如何构建这样的应用程序 我在编程方面有相当多的经验,但在设计程序方面经验很少。 我读过设计模式和设计原则,如Solid和TDD。但我发现很难知道如何实施这些想法 我遇到的一个问题是GUI和应用程序之间的隔离。在应用程序中,我们希望能够根据不同的标准进行排序。对于每个标准,都会有一个按钮(类似于列表的标题)。这将导致触发一个事件。但是我应该如何传递应该排序的标准,以及a如何发回排序后的数据 可以为每

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

我在编程方面有相当多的经验,但在设计程序方面经验很少。 我读过设计模式和设计原则,如Solid和TDD。但我发现很难知道如何实施这些想法

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


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

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

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

编辑:


我最大的担忧是试图让这个“打开-关闭”。正如有人所问,数据是对象的集合。有什么方法可以很容易地添加排序标准吗?或者这真的不可行吗?

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

看看MVC模式。

也许MVP模式对你更好


如果您有使用MVC模式的经验,请查看一些用于桌面应用程序的Java MVC框架(大部分用于web)。

您可能还想查看


关于实际实现,请参阅文章。

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

听起来确实有点像您的数据将显示在表中,如果您使用的是Swing JTable,它现在支持排序。查看来自Sun的Swing trail中的

我想说,作为一个通用的解决方案,您可能会将标准作为参数传递给排序


另一个建议是不要太担心模式,只要保持设计简单,代码可读,就可以很好地用于小型应用程序。有时很容易陷入所有好的模式中,然后尝试将它们压缩到您的应用程序中。

很高兴看到您正在考虑这个问题,这比一部分开发人员所说的要多得多


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

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


有关更多信息,请点击本页上的链接:

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

根据所使用的底层数据结构,不需要使用switch语句对数据进行排序。如果您有一个数据表,则可以使用该字符串指定排序依据的列。如果您有一个对象集合,并且列表示它们的属性,那么这就更为棘手了。在.Net中,您可以使用LINQ做一些简单的事情,让您可以通过表示为字符串的属性进行排序。但是在java中,您总是可以求助于反射来获取字段值进行排序

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

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

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

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

我实际上会使用命令模式,使用它,一个对象(通常称为Action)将封装调用方法(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;
       }
}
接受者
即使您决定使用一个事件,也要使用enum而不是int/String来区分不同类型的事件。

数据是否显示在表中?+1用于将其标记为HomeWork这与分离无关。我在PHP中使用过MVC,但从未在普通应用程序中使用过。但问题是如何设计我必须选择排序位置的部分。通过事件,我指的是观察者模式。这不是真正的问题。模式误用建议+1。如果模式能解决您的问题,请使用它。不要改变问题以适应模式。谢谢你的建议。我知道如果你有一个崭新的闪亮的锤子,你会希望一切看起来像钉子。但我认为像开闭这样的原则总是一个很好的目标,它确实是一个对象的集合。但是没有一个真正的理由
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
}