用于查找特定子类型的可扩展/有效解决方案

时间:2015-12-05 08:54:04

标签: design-patterns data-structures

有一个Room类。它包含家具清单;椅子,桌子和椅子等。只需要检索椅子列表。为每种类型的家具保留单独的清单并不是一种可扩展的解决方案。 (例如,添加新的家具类型需要新类型的列表创建等等。)但是只需要一个列表并更新它就需要遍历所有的家具,并且只能在操作员或任何操作员的帮助下找出椅子。其他方式。

如何使用设计模式或数据结构有效地设计这样的实现?

1 个答案:

答案 0 :(得分:0)

如果你想通过一些统一的聚合来有效地搜索椅子,那么你要么使用:

  1. 您引用的不可解决的解决方案
  2. 可伸缩的家具类型是一个关键 多图样式数据结构(允许不同值的数据结构) 在相同的密钥下)
  3. 一种混合解决方案。
  4. 你已经知道了那个难以理解的那个,所以让我们跳过它。

    对于#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,它将使用它使用的底层数据结构内置这些类型的功能。如果你自己滚动,通常它是基本机制方面的三个中的一个。