Мое приложение обрабатывает различные сообщения и хранит их в базе данных. Сейчас я использовал следующую конструкцию: классУлучшенный дизайн для абстракции Db с наследованием
База данных:
class DbObject
{
public:
// read/write object members from/to DB
virtual void readFromDb() = 0;
virtual void writeToDb() = 0;
// Other stuff, db connection etc.
void doDbStuff();
}
Базовый класс для сообщений:
class BaseMsg
{
public:
// read/write object members from/to DB
virtual std::string toXml() = 0;
virtual void fromXml(const & std::string s) = 0;
}
типы сообщений A, B и т.д.
class MsgA : public BaseMsg, DbObject
{
public:
std::string toXml();
void fromXml(const & std::string s);
void readFromDb();
void writeToDb();
}
Этот дизайн работает хорошо, каждое обработанное сообщение получает свой собственный объект, может быть записано в XML, прочитано из XML, сохранено и прочитано в/из m база данных с конкретными сообщениями (реализована в MsgA).
Однако в настоящий момент мы рассматриваем перенос приложения на новую платформу, где текущая база данных недоступна, поэтому мы будем использовать дополнительный тип базы данных.
Обычно у меня был бы базовый класс для доступа к базе данных и дочерние классы для каждого типа базы данных. Но с нынешним дизайном невозможно, потому что я не хочу иметь класс MsgADatabase1 и класс MsgADatabase2 и т. Д.
Есть ли какой-либо шаблон дизайна, где я мог бы сохранить свой текущий дизайн в принципе, но скрыть используемый в настоящее время тип базы данных за каким-то уровнем абстракции?
Все базы данных имеют функциональные возможности INSERT, QUERY, DELETE и UPDATE. Просто создайте абстрактный базовый класс, который поддерживает эти четыре (и возможные другие) операции, и дочерние классы, которые реализуют эти операции с конкретной базой данных. Затем используйте указатель на базовый класс в классе 'DbObject' и используйте его для выполнения операций с базой данных. –
Чтобы узнать, какой фактический экземпляр класса конъюнктуры абстрактной базы данных вы должны использовать, используйте заводскую функцию, которая принимает тип базы данных в качестве аргумента, объявление возвращает новый экземпляр правильного объекта. –