2011-04-29 52 views
3

我现在正在阅读的书“Head First OOA & D”。有代码的例子。我在接受下一个解决方案时遇到问题:Head First OOA&D - 在实体层次树中实现属性

如果系统中存在实体层次结构,则建议使用属性映射而不是写入整个类树。

例如: 股与属性的地图:

public class Unit { 
    private UnitType type; 
    private Map<String, Object> properties; 
} 

UnitType是一个枚举。

树的单位:

public class Unit { 
    private int healthVolume; 
} 

class Soldier extends Unit{ 
    private int strength; 
} 

class Tank extends Unit{ 
    private int armorAmount; 
} 

是的,也有观点认为在第一种情况是,没有工作和额外类添加新的单位的可能性。 例如,如果我有100个单元类型:

第一种情况:我必须写1个类。

第二种情况:我必须写至少10​​1个班。

但是这String from Map<String, Object>似乎并不好,因为硬编码的属性名称不是一个好的风格。添加一个枚举会略微改善代码,但也有这个Object,这似乎是非常奇怪的时候有这么多的泛型。

你有什么想法,该设计如何改进? 提前感谢您的帮助。

回答

1

但这StringMap<String, Object>似乎并不很好,因为在所有的属性名称硬编码不是一个好作风。

你是对的,假的。我认为作者希望你考虑设计,并且在某些情况下,不要建立一个较长的课程层次结构。如果你需要严格的输入和访问具有getter/setter风格的属性,那么使用这个属性映射是一个坏主意。 如果您的客户需要一个灵活的,易于扩展的层次结构,而不包含复杂的继承树,那么这个属性图是获得生产力的快速方法。

并且使用getter/setter复杂类型层次结构,您还可以获得硬编码的属性名称!