有一个Room类。它包含家具清单;椅子,桌子和椅子等。只需要检索椅子列表。为每种类型的家具保留单独的清单并不是一种可扩展的解决方案。 (例如,添加新的家具类型需要新类型的列表创建等等。)但是只需要一个列表并更新它就需要遍历所有的家具,并且只能在操作员或任何操作员的帮助下找出椅子。其他方式。
如何使用设计模式或数据结构有效地设计这样的实现?
答案 0 :(得分:0)
如果你想通过一些统一的聚合来有效地搜索椅子,那么你要么使用:
你已经知道了那个难以理解的那个,所以让我们跳过它。
对于#2,您可以使用家具类型作为关联数据结构的关键字,该结构允许具有重复键但具有不同值的条目。 C ++的一个例子是multimap
。如果语言支持,您可以依赖在运行时获取的类型信息作为键,或者像这样的解决方案:
class Furniture
{
public:
virtual ~Furniture() {}
virtual SomeKeyType key() const = 0;
};
class Chair: public Furniture
{
public:
virtual SomeKeyType key() const override
{
return "chair"; // note: doesn't have to be a string.
}
};
现在每当您将家具插入房间时,请使用此key
作为搜索关键字将其插入此关联结构中。现在,当您要搜索主席时,请使用chair
键搜索项目。这可以在对数时间或更好的时间内轻松完成。
#3混合风格的解决方案基本上是您自己的multimap
设计。您可以设计一个聚合,该聚合获取一个密钥,并根据搜索,插入,删除,迭代时提供的密钥使用相应的列表。如果你知道你没有太多的家具类型,并且不需要一个完整的树形结构或哈希表,并且可以简单地拥有一堆列表,那么这种额外的控制可能会带来一些好处。在运行时根据提供的密钥创建。
这些通常是您的主要选择。如果您使用RDBMS,它将使用它使用的底层数据结构内置这些类型的功能。如果你自己滚动,通常它是基本机制方面的三个中的一个。