你能帮我改进基于装饰的设计吗?

时间:2010-07-08 07:58:36

标签: uml

我有一个小房子来建房子。房子会有很多楼层(楼层),楼层可以有很多房间,房间可以容纳很多物品。所以我倾向于使用Decorator Pattern来完成这个程序。这是最初的设计:

http://img337.imageshack.us/img337/5530/maina.jpg

你能帮助我改进设计吗?

3 个答案:

答案 0 :(得分:2)

  

在面向对象的编程中,装饰器模式是一种设计模式,允许动态地将新/附加行为添加到现有对象。

这是wikipedia如何启动它关于装饰器模式的文章。

因此装饰器模式是关于向现有对象添加行为。并且房间中的物品不是该房间的额外行为。

我认为Composite pattern是为该域构建模型的更好选择。

(但是如果你仍然想要一个装饰器为你的房子,你可能会找到一个更好的解决方案here ;-))

答案 1 :(得分:2)

我不认为装饰者是正确的模式。 我所看到的设计是“is-a”和“has-a”关系的多个实例。

  1. “is-a”关系是一种专业化。示例:“Bungalow”“is-a”“House”,“ConcreteRoom1”“is-a”“Room”。
    • “is-a”关系是使用继承实现的。在某些情况下,有利于组合而非继承,“is-a”可能使用装饰器实现。
    • 理想情况下,“Room”或“House”结构必须是接口(或抽象类),它们定义了对象契约和基本属性
    • 这些接口的具体实现是您将使用的实际对象。
  2. “has-a”关系是一种组合。示例:“House”有“Floors”,“Room”有“Items”
    • 通常,可以通过存储您的类“拥有”的每个对象的属性来实现has-a关系。
    • 将属性存储为接口的集合始终是个好主意 - 例如Room应该有List<Item> items
  3. 希望澄清您设计中的预期用途。

答案 2 :(得分:1)

我在这里看到了很多遗产。装饰者模式决定了较少的继承和更多的构成。因此,您可以在运行时创建装饰器并修饰对象。请参阅Decorator Patter