【问题标题】:Object oriented design - design furniture system in an extendable way面向对象设计——以可扩展的方式设计家具系统
【发布时间】:2020-01-22 22:34:26
【问题描述】:

我在面试时遇到了这个问题,我不知道如何正确回答。问题是我们有一个家具系统,我们可以管理不同的家具。每件家具都有自己的material(例如:木头、铁)和nametype(例如:椅子、桌子、桌子)。

对于每件家具,我们可以致电isFireApproved()getWeight()。 首先,我在顶部绘制名为FurnitureMaterial 的基类。在家具下,我放置了不同类型的家具,如桌子、椅子,并对材料类做了同样的事情。如下图。

然后,我说如果我们想生产像woodchair这样的新家具,我们可以创建一个名为woodchair的新类,它继承wood类和chair类。

然后面试官问如果我们有成千上万种不同的家具怎么办?在这种架构中可能会发生什么以及如何解决它?我基本上卡在这里并回答我们可以制作一个通用类,将家具类型和材料传递给实例。

例如:

wood_iron_wardrobe = CommonFurniture(type=[Wardrobe], materials=[Wood, Iron])

在构造函数中,我们利用这些参数来创建一个新的家具项目。根据面试的面相,我认为我没有按照正确的方向回答。这个设计有什么建议吗?或者有没有学习OOD的推荐?

【问题讨论】:

    标签: oop


    【解决方案1】:

    恕我直言,正如您所写的“我们可以创建一个名为 woodchair 的新类,它继承了 wood 类和 chair 类”,我认为,他不喜欢为家具和材料的每种组合创建一个新类的想法,因为大量可能的类。在这种情况下,人们可能更喜欢组合而不是继承。例如Furniture 有一个Material 类型的成员/属性。因此,Furniture 需要 m 具体类,Material 需要 n 类。使用继承,您将需要m x n 类用于具体产品。

    另外Material 通常是静态的,您很少会更改Material 中的任何内容。在许多语言中,多重继承是不可能的。在 Java 中它可能看起来像这样:

    enum Material (
       WOOD (...),
       IRON (...)
    )
    
    class Furniture {
       Material material;
    }
    
    Furniture woodChair = new Chair(Material.WOOD);
    Furniture ironChair = new Chair(Material.IRON);
    

    这只是一个例子,人们可以用更好的方式来实现它。

    【讨论】:

    • 我意识到这被称为decorator 模式。
    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多