哪种设计模式适合这种情况?

时间:2011-08-31 13:15:11

标签: php oop design-patterns

到目前为止,我一直在处理的大多数对象看起来非常像它们所基于的数据库表。所以我有一个fish对象映射db.fish表和fish_transfer对象,它映射db.fish_transfer表等。

现在我正在开发一个类Provenance来管理不容易映射到单个数据库表的数据。情况如下:

每条鱼都有出处,即有关它进入我们系统之前的位置的信息。有4种出处:“未知”,“已交付”,“现场培育”,“重复使用”。所有种源都有一个fish_id和一个相关的日期,除了“现场培育”之外的所有种类都要求立即计数。除此之外,它们与它们相关的数据以及在创建/删除或更改时必须采取的行动是完全不同的。

我曾想过将鱼源物种存放在鱼类物体中。因此,在实例化时,fish会调用ProvenanceFactory::make($this->fish_id, $this->ptype)并获取正确子类的起源对象$prov。那么如果编辑出处类型会发生什么呢?

的可能性:

  • 致电$this->prov->delete(),然后致电$this->prov=ProvenanceFactory::make($this->fish_id, $newtype); $this->prov->setall($data);
  • 致电ProvenanceFactory::morph(&$this->prov,$newtype); $this->prov->setall($data);
  • 致电$this->prov->morph($newtype); $this->prov->setall($data);
  • 致电$this->prov->morph($newtype, $data);
  • ...

在所有情况下,编辑起源类型会导致更新或删除特定于Provenance子类的各种表中的一组数据库行,然后在各种其他表中创建另一组行。

上述哪种可能性(或其他)是最好的方法?我应该尝试实施哪些设计模式(工厂除外)?

2 个答案:

答案 0 :(得分:1)

如何拥有一个ProvenanceBase类,它有一个复制构造函数 这样,你的工厂可以有一个变形方法(类似于你写的第二个子弹),它只是从现有的派生的对象中创建一个新的派生的对象。

答案 1 :(得分:0)

我不想建议重新映射您所做的一切,但是您是否考虑过使用类表继承。

请参阅:http://martinfowler.com/eaaCatalog/classTableInheritance.html

因此,在您的示例中,您的Provenance表格可以使用您的discrimator coloumn来确定该类所处的状态。