Вы можете использовать простую версию, такую как:
struct backend {
int (*insert)(...);
int (*remove)(...);
...
};
static struct backend db_backend = { db_insert, db_remove, ... };
static struct backend other_backend = { other_insert, other_remove, ... };
const struct backend *get_backend(enum backend_type type)
{
switch (type)
{
case DB_BACKEND:
return &db_backend;
case DB_OTHER:
return &db_other;
...
}
}
Все вышеперечисленное может быть скрыто в файле C, с get_backend
и перечислением общедоступным.Затем вы можете использовать его следующим образом:
struct backend *b = get_backend(DB_BACKEND);
b->insert(...);
b->remove(...);
Многие детали, конечно, отсутствуют (многим нравится, например, typedef
).Это базовая настройка, вы также можете создавать функции-оболочки, если вам не нравится синтаксис b->insert(...)
или если вы хотите установить бэкэнд один раз, а затем использовать insert()
и remove()
в коде.Это также полезно, если у вас уже есть какой-то код, который вызывает insert()
напрямую, и вы хотите направить вызов на правый задний конец.
Если вы хотите более сложное решение, взгляните на http://www.cs.rit.edu/~ats/books/ooc.pdf. Вам не нужно реализовывать все до мелочей, но это может дать вам несколько идей.