我有三个简单的类来说明。人们有很多项目有很多任务。
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上显示一个人拥有的项目名称列表,并在每个项目之后显示一个任务名称列表+描述该项目有。
有没有最好的方法来处理这个问题还是真的没关系?就个人而言,我倾向于2)因为1)将对象应该如何显示到该对象的想法联系起来,但感觉这应该在一个地方决定,即人。这样我就可以轻松地从stdout更改为文件。 3)让Person直接访问Task,这是一个以前没有耦合的类(至少它只是通过Project间接耦合)。
有比这3个更好的解决方案吗?
注意:这可能是一个与语言无关的问题,但我碰巧是用Java编写的,我想很有可能是不同语言的不同最佳解决方案所以我想答案< em>至少解决了Java方面的这个问题。
答案 0 :(得分:2)
访客模式:没有人知道如何打印和打印什么。您只需将项目/人员/任务分配给访客对象即可。项目/人/任务迭代他们拥有/了解的对象并将访问者传递给他们。
访问者做了正确的事情 - 它知道如何从它访问的对象访问信息,如果信息应该打印,在哪里:console / file / database或者其他什么,它也知道如何格式化:xml / html / plain我想到text / csv作为例子。
这是您可以随意设计项目层次结构,更改打印目标和格式等。
答案 1 :(得分:0)
如果它仅用于显示任务名称,并且您不希望Person
依赖Task
,那么我建议添加方法
List<String> getTaskNames();
到Project
课程。这就是项目应该能够分辨的内容:任务的名称。
或者创建一个额外的TaskMetaData
类,它包含所有属性,一个人需要了解任务,并返回TaskMetaData
个对象的集合。我更喜欢连接字符串。