配件的设计

时间:2011-07-18 14:09:23

标签: c++ oop design-patterns

鉴于我有

class IChunk
{
  public:
    const char* getRawData() = 0;
    ...
};

class Chunk
{
  public:
    const char* getRawData();
    ...

  private:
    char* data;
};

class IDatabase
{
  public:
    IChunk* getChunk( int index ) = 0;
    ...
};

class Database : public IDatabase
{
  public:
    IChunk* getChunk( int index );
    ...

  private:
    std::vector< Chunk > m_chunks;
};

我想用getRawData()以不同的方式解释IChunk返回的原始数据。访问者使用IDatabaseIDatabase接口。

  1. 创建访问者的最佳位置是什么? 使用这样的创建函数扩展IAccessor* a = database->createAccessor( ACC_ID_1, index ); IAccessor1* a1 = dynamic_cast< IAccessor1* >a; IAccessor* a = database->createAccessor( ACC_ID_2, index ); IAccessor1* a2 = dynamic_cast< IAccessor2* >a; 接口是否正确:

    index

    其中ACC_ID_x是块索引,IAccessor3* a3; database->createAccessor( ACC_ID_3, index, (void**)&a3 ); 是访问者接口ID。

  2. 在这种情况下需要动态演员,这可能不安全且设计不是很好。我能改进吗?

  3. 我应该考虑使用哪种设计模式来实现访问者的工厂?我的目的是允许动态添加访问者(和相应的访问者ID)。

  4. 通过以下方式实现访问者创建是否可以:

    {{1}}

1 个答案:

答案 0 :(得分:1)

为什么不将数据库对象和块索引作为构造函数参数传递给访问器?

class IAccessor
{
protected:
  IAccessor (IDatabase *database, int index) : m_database (database), m_index (index) {}
  IDatabase *m_database;
  int m_index;
};

class Accessor1 : public IAccessor
{
public:
  Accessor1 (IDatabase *database, int index) : IAccessor (database, index) {}
};

然后:

Accessor1 a1 (database, index);
some_value = a1.SomeFunction ();