为方便起见,我用个假想的例子来描述这个问题:
设想某组织需要一个计划系统,实现制定计划、执行计划和实时显示执行情况三个主要功能。计划有很多种,例如生产计划、销售计划、培训计划,不同类型的计划具有一些共同的属性,比如说名称、起始时间、结束时间、进度,又具有差异很大的属性,如生产计划的物料,销售计划的片区,培训计划的课程等等。现在的要求是一致地对待这些计划,具体到三个功能分别如下:
(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)制定计划时所有计划列在一个列表中(数据结构也要求是在一个列表),既要显示共同的属性,又要显示不同的属性,大致如下所示,但是不同的属性的类型和值都不一样,属性的个数也不一样。编号 类型 名称 起始时间 结束时间 其他独特的属性(*)
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的原则的。实际上,我比较关心的是计划项的数据结构,计划项基本上只有一些简单的获取、设置和保存属性值的操作就够了,但是要处理差异的属性,很头疼啊
是不是可以考虑 "Composite" 模式