这个设计得好吗?这些参数是否正确应用?

时间:2014-07-07 18:49:24

标签: java oop design-patterns

最近,我一直在设计动物生活模拟器,最终遇到了一些设计问题。我会尽可能地总结一下,只指出必要的(我认为)。

问题

我试图让生物有能力繁殖。然而,有些人会有性生殖,并且无性繁殖。

由于希望在open/close princible之后保持设计的动态性和灵活性,我决定使用strategy pattern,最后得出以下情况:

enter image description here

尽管能够创建不同类型的复制品,每种类型都有自己的算法,但有性生殖的类型需要一个参数,这将是另一种生活方式。

研究互联网时,我发现可以修改策略模式以利用可扩展的参数类型。考虑到这一点,我决定为ReproduceBehavior上存在的方法重现创建一个参数。这就是我得到的:

enter image description here

问题

我真正怀疑的是不同类型的再现参数的实现。

即使我为有性生殖创造了一个参数,对无性繁殖也没有意义,对吧?出于什么原因,我为无性繁殖提供参数?如果你告诉我它没问题,只要我在方法的实现中忽略这个参数,这是可以接受的,那就好了。

那么,我该如何实现有性生殖的参数呢?我应该创建一个名为 SexualParameter 的具体类来实现接口 ReproductionParameter 吗?另外,如何让 SexualReproduction 认识到它的 ReproductionParameter SexualParameter ?我应该使用 instanceof 吗?这是否正确(最佳做法)?

我真的很困惑。有谁可以帮助我?

修改

由于我的同伴发誓要结束我的问题,我正在编辑它以使其受到更多限制,并且有特定的标准需要解决。所以我们走了......

我们在谈论复制,对吗?我不能简单地在模拟器中模仿现实生活(现在,我相信......),但我可以接近这种情况(毫不夸张)。所以我在这里公开并更好地定义复制标准:

  1. 所有生物都会复制。
  2. 有些人会重现以下三种方式之一:性,无性和两种方式。
  3. 所有人都有性别。性别是男性或女性(同性恋动物不能复制,对不起)。
  4. 女性与男性交配,反之亦然。
  5. 所有生物在生育期间可以生产0,1或几个孩子 行为。
  6. 不同的生物具有复制标准。如果被接受, 复制成功。
  7. 生物只能用另一种同类型繁殖。
  8. 我会接受任何满足这些规则的设计。能够满足这些条件的第一个答案对我来说是正确的。如果你将基于我们在这里谈论的内容并不重要......正如我所说,只需要满足这些规则。

    编辑2

    坦率地说,有一套规则和标准可用于完成良好的设计。有一点可以肯定,这里已经证明了这一点。代码重用是任何设计的关键。这可以通过不同的方式完成,其中一种方法是使用继承。当继承最终损害重用时,不应该使用它。

    对于我的程序员,不要将项目设计视为基于意见的东西。项目设计是严肃而具体的。没有人根据自己的意见创建代码片段。这让我想起了Entity Relationship Model(ERM)。这是一门精确的科学,只有案例的变化,而不是我们根据每个规则应用建模的方式。同样,类建模不是基于意见的事物。那里的版主退伍军人只是在没有方向的情况下徘徊吗?有时我后悔不知道某些事情。

2 个答案:

答案 0 :(得分:3)

我认为" ReproductionBehaviour"在某种程度上某些物种可能同时具有性和无性繁殖行为(虽然,我知道每个物种都需要至少有一种繁殖方法),这在某种程度上是不自然的。

这就是我的模特

interface SexualReproduction<T extends LivingBeing>{
    void reproduce(T partner);
}

interface AsexualReproduction{
    void reproduce();
}

abstract class LivingBeing{

}

class Cat extends LivingBeing implements SexualReproduction<Cat>{

    @Override
    public void reproduce(Cat partner) {

    }
}

class Bacteria extends LivingBeing implements AsexualReproduction{

    @Override
    public void reproduce() {
    }

}

class Starfish extends LivingBeing implements AsexualReproduction,SexualReproduction<Starfish>{

    @Override
    public void reproduce(Starfish partner) {

    }

    @Override
    public void reproduce() {

    }

}

答案 1 :(得分:0)

我会支持几步并询问,&#34;这将如何使用?&#34;答案是来电者需要知道LivingBeing是否有性或无性。因为他们需要知道传递ReproductionPartner,对吧?或者它应该是一个空参数。因此,我不确定SexualReproductionAsexualReproduction基于通用界面是否有意义。只有在调用代码可以交换它们而不关心实际使用哪个接口时,它才真正起作用。 This is the L is SOLID

所以你可能不想要额外的参数。这意味着让LivingBeing足够聪明,知道他们要用谁来复制(这意味着你可能想要LivingBeing的子类或接口),或者放弃共同ReproductiveBehavior的想法。 1}}。