【问题标题】:Which design pattern should I use for a TODO list in Java?我应该为 Java 中的 TODO 列表使用哪种设计模式?
【发布时间】:2010-11-29 09:16:33
【问题描述】:

对于一个非常简单的面向对象的待办事项列表,我应该使用哪种设计模式?

最初,我从 Task、TaskList、Driver 的类开始。还有一个显示任务标题列表的简单 UI。添加新任务时,我一直在努力让 UI 更新列表,在尝试解决这个问题时,我意识到我的整个布局可能是错误的。

我正在寻找可以给我一个基本方向的人,或者一个指向设计模式图的链接,并提供一些关于我的类如何与图表相关的指导。

谢谢。

【问题讨论】:

    标签: java design-patterns oop


    【解决方案1】:

    另一条建议:假设您在 Swing 中编写 UI,不要使用 DefaultTableModel 并将 Tasks 从您的 TaskList 复制到模型中(即不要持有您的数据在两个地方)。相反,将AbstractTableModel 子类化并让它充当TaskList 的薄包装器;例如

    public class TaskTableModel extends AbstractTableModel {
      private final TaskList taskList;  
    
      public TaskTableModel(TaskList taskList) {
        this.taskList = taskList;
      }
    
      public Object getValueAt(int row, int column) {
        Task task = taskList.getTask(row);
        Object ret;
    
        switch(column) {
          case 0:
            ret = task.getStartTime();
            break;
          case 1:
            ret = task.getState();
            break;
            // etc ...
        }
    
        return ret;
      }
    
      // TODO: Implement other TableModel methods.
    }
    

    【讨论】:

    • 目前我的Tasklist 类存储一个'Task' 对象类型的ArrayList。你认为在桌子上做会更好吗?
    • 这是我在处理此类问题时通常采用的方法,其中表中的每一行对应一个业务对象,每一列都是业务对象的属性之一。我会远离 JList; API 很烂,你总是可以用单列 JTable 来模仿它。
    【解决方案2】:

    一般架构应该实现模型-视图-控制器 (MVC) 模式(或模型-视图-Presenter,具有更强的模型和视图解耦),它看起来就像您已经开始使用的那样。您有代表“任务”和“任务列表”的类,并且您有一个 UI 可以将任务列表(模型)呈现给用户。现在您需要模型和 ui 的接口(或一组接口),并且您想确保模型不知道 ui 而 ui 不知道模型。

    因为在这两者之间,您有演示者类,它将对模型更改和 ui 事件做出反应(观察者模式,数据绑定作为一种技术)。它可以监听模型并更新视图。所以你想让你的模型可观察。它可以监听视图中的事件(值编辑、操作)并将此信息传递给模型,因此它可以(尝试)适应用户预期的更改(模型并且只有模型会验证用户输入并给出对演示者的回应)。

    是的,这很复杂。首先,将您的应用程序分成三个部分(模型、视图、控制器/演示器)并使模型可观察。因此,您可以轻松地从模型更改时自动更新的视图开始。然后,您可以逐步添加对 UI 上的用户输入做出反应的功能。

    【讨论】:

      【解决方案3】:

      我认为您想要观察者模式 - 但请查看之前的堆栈溢出问题Should I use a Listener or Observer?

      【讨论】:

      • 嗨 jskaggz,这对 UI 部分很有用,但是我希望对解决方案的整体方法有一些指导。
      • 我的错,我以为您要求指出正确的模式。 :-P 切入正题,如果您使用的是 java,请获取实现观察者模式的釉面列表 (glazedlists.com)
      【解决方案4】:

      模型-视图-控制器 (MVC)。基本上,模型存储任务,控制器处理事件,视图显示。您可以有多种视图,即一种用于在 UI 中显示任务,另一种用于保存到磁盘。

      【讨论】:

        【解决方案5】:

        没有一些代码或图表很难理解你的设计,但我会试一试

        取决于您的具体情况,它是在 后端(数据库/控制器)中更新并反映在 前端(View-html5,angularJs)中还是反之亦然,或者它可能发生在您要应用修复(前端/后端)的任何地方,请在应用修复时考虑所有交互。

        在前端可能的方法中

        1. Ajax(数据从前端到后端来回流动)
        2. Angular js 使用可以使用 promise 或简单的 $http,或者像 ng-repeate 这样简单的东西。
        3. HTML5 - 有一些动态数据列表控件

        在后端可能的方法中

        1. 观察者模式
        2. 整个架构,您可以使用事件驱动架构https://martinfowler.com/articles/201701-event-driven.html 因为你觉得你的设计从一开始就错了。

        当您正在寻找基本方向时,这可能会有所帮助

        1. https://martinfowler.com/aboutMe.html
        2. Effective-Java-2nd-Joshua-Bloch
        3. 头一本书

        2 美分 - 使用一些框架,如果您开始设计之旅,它们会让生活更轻松。

        使用框架,比方说 SPRING 迫使您使用许多您甚至不知道的模式,例如 MVC、Front Controller、AOP、Singleton(beans)、Template(JDBC,JpaTemplate) 等。

        在那之前的快乐设计:)

        【讨论】:

        • 您好,Arvind。忽略我在2009年问过这个!您已经回答了这个问题,这完全混淆了问题所在的 Java 和 JavaScript,这简直是天壤之别!以及为什么您包含指向 Martin Fowlers 的关于我的页面的链接,我不知道。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多