我正在制作一个代码来制作一个电视节目。
所以我需要做出这样的数据:
dayParting
可以有倍数DayParts
DayPart
可以有倍数TimeParts
。DayPart
和DayParting
有开始时间和结束时间TimePart
这只是一个小时,并且当时要显示该程序。我第一次只是使用Lists来完成这项工作,但我开始认为太“不开放”而且“实施而不是intarface”解决方案,所以我开始寻找替代解决方案这个问题。
我正在考虑使用复合图案,图案提供灵活性,打开扩展并允许我统一处理复合和单个对象。
所以,我认为我的课程应该是:
class AbstractDayparting{ //
}
class DayParting extends AbstractDayparting{ //Composite
}
class TimePart extends AbstractDayparting{ // Leaf
}
我觉得我可以使用复合图案,但我有两种不好的感受:
我不知道(1)是否正常,(2)我不知道如何获取特定类型的所有复合对象(例如:所有DayParts)。
我正在强迫这种模式?它有更好的解决方案吗?
答案 0 :(得分:2)
我的自定义复合模式非常“严格”,因为叶子始终处于最低级别。
一个A有很多B,一个B有很多Cs。它的自然C处于最低水平。这没什么不对。
我需要从特定级别获取对象。
由于DayPart属于DayParting,因此您可以调用DayParting.getDayParts()来获取所有DayPart。示例代码:
/**
* A parting is a period of time.
*/
abstract class Parting {
final int beginingHour;
final int endHour;
public Parting(int beginingHour, int endHour) {
this.beginingHour = beginingHour;
this.endHour = endHour;
}
public int getBeginingHour() {
return beginingHour;
}
public int getEndHour() {
return endHour;
}
}
class DayParting extends Parting {
List<DayPart> dayParts = new ArrayList<DayPart>();
public DayParting(int beginingHour, int endHour) {
super(beginingHour, endHour);
}
public List<DayPart> getDayParts() {
return dayParts;
}
}
class DayPart extends Parting {
List<TimePart> timeParts= new ArrayList<TimePart>();
public DayPart(int beginingHour, int endHour) {
super(beginingHour, endHour);
}
}
class TimePart extends Parting {
public TimePart(int beginingHour) {
super(beginingHour, beginingHour + 1); // only one hour
}
}
假设属于DayParting的所有DayPart都有相同的(beginingHour,endHour),你添加这个
class DayParting extends Parting {
public void addDayPart() {
dayParts.add(new DayPart(this.beginingHour, this.endHour));
}
}
假设属于DayParting的每个DayPart都有个人(beginingHour,endHour),你添加这个
class DayParting extends Parting {
public void addDayPart(int beginingHour, int endHour) {
dayParts.add(new DayPart(beginingHour, endHour));
}
}
问题是,DayParting只有一个DayPart类型,但是很多实例,所以它仍然是Composite模式。好消息是,您可以在将来添加更多类型,只需进行非常小的更改。
class VariantDayPart extends DayPart {
public VariantDayPart(int beginingHour, int endHour) {
super(beginingHour, endHour);
}
}