为方便起见,我用个假想的例子来描述这个问题:
设想某组织需要一个计划系统,实现制定计划、执行计划和实时显示执行情况三个主要功能。计划有很多种,例如生产计划、销售计划、培训计划,不同类型的计划具有一些共同的属性,比如说名称、起始时间、结束时间、进度,又具有差异很大的属性,如生产计划的物料,销售计划的片区,培训计划的课程等等。现在的要求是一致地对待这些计划,具体到三个功能分别如下:
(1)制定计划时所有计划列在一个列表中(数据结构也要求是在一个列表),既要显示共同的属性,又要显示不同的属性,大致如下所示,但是不同的属性的类型和值都不一样,属性的个数也不一样。编号 类型 名称     起始时间  结束时间  其他独特的属性(*)
1    生产 生产砖头 2月4日    5月10日   物料:泥、水;车间:#3
2    培训 春季培训 2月8日   2月28日   课程:生产砖头;培训级别:3
3    销售 红色风暴 2月10日   3月25日   片区:西南、东北、东南、中南、华北
……功能支持一般的增删改和保存和打开,保存时是所有计划保存在一个文件中。
* 这里只是说明大概,如何处理(显示、编辑、保存、加载)不同计划的独特属性正是我需要知道的
(2)执行计划时,从列表中取得计划项,然后开辟线程去执行,不同类型的计划用不同类型的线程。
(3)执行计划过程中,执行线程实时地上报进度、日志等信息,这些信息又需要集中显示,比如假定用带有编号的线来表示进度,所有计划的进度情况在一个图中显示,用带编号的字符消息列出日志,所有日志记录在一个列表中列出,如下所示,而主要的问题在于不同类型的计划执行,相应于其独特的属性上报的信息内容和格式也不一样。
进度:
1------------------------------------50%
2--------------------------30%
3----------------------------------------------60%
……
日志:
日志:
计划编号 日期 时间 消息内容
1 2月25日 22:30 物料短缺,生产被迫中止
2 2月26日 18:00 培训中期考试,十人作弊
1 2月26日 21:00 恢复生产
……我想大家会觉得这个问题就像教科书一样,是典型的多态问题,用虚函数机制来解决。但是多态这个东西我也用得不少,但是这里有些地方总想不通,比如说主要就三个方法吧:
  CustomParam(); // 定制计划,说白了就是填写参数
  CarryOut();//  执行计划
  PrintResult();// 实时报告计划执行的结果因为是VC、CBuilder下做,定制计划(填写参数)是要调用Dialog或者Form来输入,但是在CustomParam中调用对话框、窗体显然不妥,因为计划更多的是一个实体类,我感觉实体类里面不应该关联界面类,PrintResult也类似。此外,这里如果把界面、控制和数据都混在一起,是有违MVC的原则的。实际上,我比较关心的是计划项的数据结构,计划项基本上只有一些简单的获取、设置和保存属性值的操作就够了,但是要处理差异的属性,很头疼啊

解决方案 »

  1.   

    不同类型的对象 需要一致对待
    是不是可以考虑 "Composite" 模式
      

  2.   

    使用Composite模式确实是一种相对贴合的方案,因为这种情况与窗体控件(组件)很类似,不同的窗体控件属性差异也很大,而其行为基本一致,比如说OnDraw这样的方法,我也是希望用这种思路来解决。但是感觉窗体控件是有点特殊的,它自身相对完备(MVC俱全),而我前面提到的计划,更多的作为一个实体类或者控制类。从数据模型和视图分离的角度来说,计划项并不应该直接调用对话框或者窗体来设置参数,所以第一步——设置计划项参数,就遇到不大不小的困难。