【问题标题】:Is a good idea use composite pattern for this?为此使用复合模式是个好主意吗?
【发布时间】:2016-06-06 23:53:45
【问题描述】:

我正在编写代码来制作自定义电视时段。

所以我需要制作这些数据:

  • 一个dayParting可以有多个DayParts
  • DayPart 可以有多个 TimeParts
  • DayPartDayParting 有一个开始时间和一个结束时间
  • TimePart只有一个小时,到时候有节目要播放。

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

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

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

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

感觉可以用复合模式,但是有两个不好的感觉:

  1. 我的自定义复合图案非常“刚性”,因为叶子总是在最低处 水平。
  2. 我需要从特定级别获取对象。

我不知道 (1) 是否合适,并且 (2) 我不知道如何获取特定类型的所有复合对象(例如:All the DayParts)。

我在强制模式?有没有更好的办法解决这个问题?

【问题讨论】:

    标签: java design-patterns composite


    【解决方案1】:

    我的自定义复合模式非常“刚性”,因为叶子总是处于最低级别。

    一个A有很多B,一个B有很多C。自然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 的 DayParting 都有相同的(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);
          }
        }
    

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      相关资源
      最近更新 更多