我才刚刚开始面向对象,问题可能比较幼稚,大家不要笑哦。假设我的系统要管理人,白人,黑人等等,并要存入数据库中。那么很自然,我抽象了一个TPeople类,定义了虚方法:ReadFromDB、InsertToDB、UpdateToDB等(它们的功能是可以插入、更新数据库中的信息,也从数据库中取出符合要求的某个人);然后我泛化出TWhitePeople和TBlackPeople,同时重载并实现刚才提到的方法。为了与数据集良好衔接,我又抽象了一个复数的TPeoples类,继承自TCollection,同时修改了TPeople类继承自TCollectionItem,这样通过实现Add,Delete等方法就可以和数据集保持一致了。如果所有的数据都存到同一个表里,当然不会有问题了,但问题是一类人就是一个表,毕竟他们除了相同的属性外(字段)其他的都不一样了!于是我又从TPeoples泛化出对应的TWhitePeoples和TBlackPeoples,它们使用各自对应的数据集。我想这样应该能工作。但是,如果哪天要加入黄种人怎么办?难道一样要再泛化出TYellowPeoples?再加入棕色人种呢?仍然依此类推?是不是太没有效率了?有没有更好的方法呢?

解决方案 »

  1.   

    怎么感觉像在说JAVA?加入人种就得加入类,不知道C++之类的语言是不是可以通过模板实现,但DELPHI没有模板
      

  2.   

    二楼的 ysai:怎么感觉像在说JAVA?
    加入人种就得加入类,不知道C++之类的语言是不是可以通过模板实现,但DELPHI没有模板=========================================================
    对C++不熟,您能不能详细解释下它的模板?如果您说的是设计模式里的模板模式的话,Delphi也是有的。据我所知,模式中只有单列模式(Singleton)对语言比较依赖,其他的都对语言没什么要求的。
      

  3.   

    to johnmack:
      正在看,晕乎晕乎的,您觉得这个问题跟哪个模式比较对得上号呢?提示一下也好。
      

  4.   

    但问题是一类人就是一个表,毕竟他们除了相同的属性外(字段)其他的都不一样了!个人意见是从TPeoples派生出不同的人种,因为一类人种,毕竟他们存在差异,从业务逻辑上来说,就是不同的业务需求。定义时,m_Peoples: TPeoples;实例化,m_Poeples := TYellowPeoples.Create;
      

  5.   

    你用的这种设计,和Factory Method比较像
    这种设计缺点就是不能很好的适应变化,在处理增加、删除类的时候,改动量比较大你可以采用Prototype模式,用数组或者TList一类的定义一个prototype mamager,
    然后将各种人加入prototype mamager,需要使用什么样的人,就clone一个
      

  6.   

    我的想法是:工厂模式 + 原型模式工厂模式负责永久层相关类
    原型模式负责具体人种的分配,prototype manager 同时兼作与永久层(TDataSet)衔接的工作。结帖!