考虑这样一个简单类层次应该如何设计?



动物
肉食 草食
杂食动物???
鸡鸭鹅 猪牛羊

interface 动物{
boolean can吃草();
boolean can吃肉();
}

class 肉食动物{
...
}
class 草食动物{
...
}

class 杂食动物{
...
}
class 鸡 extends 草食动物{
...
}

class 猪 extends 杂食动物{
...
}




interface 肉食动物{
boolean can吃肉();
}

interface 草食动物{
boolean can吃草();
}

interface 杂食动物 extends 肉食动物,草食动物{
}

class 猪 implements 杂食动物{
...
}
class 鸡 implements 草食动物{
...
}


上边的别看了[/font]


动物
肉食 草食
杂食动物???
鸡鸭鹅 猪牛羊

第1种...
interface 动物{
boolean can吃草();
boolean can吃肉();
...
}

abstract class 肉食动物 implements 动物{
boolean can吃草(){
return false;
}
boolean can吃肉(){
return true
}
...
}
abstract class 草食动物 implements 动物{
...
}

abstract class 杂食动物 implements 动物{
...
}
classextends 草食动物{
...
}

classextends 杂食动物{
...
}



第2种...

interface 动物{
...
}
interface 肉食性{
boolean can吃肉();
}
interface 草食性{
boolean can吃草();
}

interface 杂食动物 extends 肉食动物,草食动物{
}

class 猪 implements 杂食动物{
...
}
class 鸡 implements 草食动物{
...
}

用工厂模式试试看。不过代码量可能不小,但是以后的扩展可以比较方便。

我想了想,如果层次比较多时,使用工厂比较复杂。很容易把人搞糊涂。意议在使用模式时不能生搬硬套。应该以简单为妙。

刚才的图有误现改正

附代码如下:
bfh365J0RA275xjI.rar
另外代码可能有不完备之处,请指点。

如果吧肉食,素食和杂食和鸭,猪和老虎这个系列分开是不是要好一点,用Bridge来组合,就象大家常说的可乐和冰的那个例子,我手头没工具只好胡说的。

你好像没有提出一个明确设计目标,哪些变化最少,哪些可能会动态拓展?在没有设计目标的情况下,所有的设计方案都是可以采用的。

我觉得用桥梁模式比较好,抽象部分是动物,实现部分是动物的食性。
动物可分为鸡鸭鹅猪牛羊狼,食性分为肉食性、草食性和杂食性。
这样,让动物拥有食性会比较好,也减少了类层次。
(我的together给删了,没画类图,抱歉!)

肉食/草食/杂食的分别对你有多重要?

1 如果真的不可避免地会导致接口差异,使用你的第二种类层次是很自然的;

2 否则的话,我宁愿只用一个成员变量(对象)来表示该属性,让类层次精简一些;必要时为该成员对象另起一个独立的类层次;无所谓这是什么模式,这是“聚合”优先于“继承”的精神的一个典型样例。

class 食性 {}

class 动物
{
private 食性 shixing;
}