如何在这些课程中委派责任?

时间:2011-04-07 07:05:20

标签: java class-design

我有三个简单的类来说明。人们有很多项目有很多任务。

public class Person {
  private ArrayList<Project> projects;

  public Person() {
    projects = new ArrayList<Project>();
  }

  public printTasks() {
    //TODO
  }
}

public class Project {
  private String name;
  private ArrayList<Task> tasks;

  public Project(String name) {
    this.name = name;
    tasks = new ArrayList<Task>();
  }

  public getName() {
    return name;
  }
}

public class Task {
  private String name;
  private String description;

  public Task() {
    tasks = new ArrayList<Task>();
  }

  public getName() {
    return name;
  }

  public getDescription() {
    return description;
  }
}

我的问题涉及实现Person.printTasks()的最佳方式。我想在stdout上显示一个人拥有的项目名称列表,并在每个项目之后显示一个任务名称列表+描述该项目有。

  1. 创建Task.printTask()并打印出该任务的名称和描述。创建Project.printTasks()并打印出项目名称,然后在每个任务上调用printTask。让Person.printTasks在每个项目上调用printTasks。
  2. 创建Task.getTaskString()并连接该任务的名称和描述并将其返回。创建Project.getTasksString()并创建一个包含项目名称的字符串,然后在每个任务上调用getTaskString,连接每个结果。让Person.printTasks()在每个项目上调用getTasksString并打印出每个字符串。
  3. 创建Project.getTasks()并让它返回任务的ArrayList。让Person.printTasks()为每个项目调用Project.getName和Project.getTasks(),打印项目名称,然后迭代返回的tasks数组,在每个数组上调用getName()和getDescription()并打印出来。
  4. 有没有最好的方法来处理这个问题还是真的没关系?就个人而言,我倾向于2)因为1)将对象应该如何显示到该对象的想法联系起来,但感觉这应该在一个地方决定,即人。这样我就可以轻松地从stdout更改为文件。 3)让Person直接访问Task,这是一个以前没有耦合的类(至少它只是通过Project间接耦合)。

    有比这3个更好的解决方案吗?

    注意:这可能是一个与语言无关的问题,但我碰巧是用Java编写的,我想很有可能是不同语言的不同最佳解决方案所以我想答案< em>至少解决了Java方面的这个问题。

2 个答案:

答案 0 :(得分:2)

访客模式:没有人知道如何打印和打印什么。您只需将项目/人员/任务分配给访客对象即可。项目/人/任务迭代他们拥有/了解的对象并将访问者传递给他们。

访问者做了正确的事情 - 它知道如何从它访问的对象访问信息,如果信息应该打印,在哪里:console / file / database或者其他什么,它也知道如何格式化:xml / html / plain我想到text / csv作为例子。

这是您可以随意设计项目层次结构,更改打印目标和格式等。

答案 1 :(得分:0)

如果它仅用于显示任务名称,并且您不希望Person依赖Task,那么我建议添加方法

 List<String> getTaskNames();

Project课程。这就是项目应该能够分辨的内容:任务的名称。

或者创建一个额外的TaskMetaData类,它包含所有属性,一个人需要了解任务,并返回TaskMetaData个对象的集合。我更喜欢连接字符串。