这是一个好主意使用复合模式吗?

时间:2016-06-04 06:34:36

标签: java design-patterns composite

我正在制作一个代码来制作一个电视节目。

所以我需要做出这样的数据:

  • dayParting可以有倍数DayParts
  • DayPart可以有倍数TimeParts
  • DayPartDayParting有开始时间和结束时间
  • TimePart这只是一个小时,并且当时要显示该程序。

我第一次只是使用Lists来完成这项工作,但我开始认为太“不开放”而且“实施而不是intarface”解决方案,所以我开始寻找替代解决方案这个问题。

我正在考虑使用复合图案,图案提供灵活性,打开扩展并允许我统一处理复合和单个对象。

所以,我认为我的课程应该是:

class AbstractDayparting{ //
}
class DayParting extends AbstractDayparting{ //Composite
}
class TimePart extends AbstractDayparting{ // Leaf
}

enter image description here

我觉得我可以使用复合图案,但我有两种不好的感受:

  1. 我的自定义复合模式非常“严格”,因为叶子总是最低的 水平。
  2. 我需要从特定级别获取对象。
  3. 我不知道(1)是否正常,(2)我不知道如何获取特定类型的所有复合对象(例如:所有DayParts)。

    我正在强迫这种模式?它有更好的解决方案吗?

1 个答案:

答案 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);
      }
    }