Шаблон проектирования для выбора другой базы данных - PullRequest
0 голосов
/ 16 марта 2020

Я создал класс для взаимодействия с моей базой данных:

class MyDatabase {
  connect() { /* ... */ }
}

И база данных имеет два типа режимов: администратор и клиент. Я хотел бы иметь разные классы для каждого режима:

class MyDatabaseAdmin {}

class MyDatabaseClient {}

Оба они будут реализовывать один и тот же интерфейс, но с разными реализациями подчеркивания. Я хотел бы знать, существует ли шаблон проектирования для создания экземпляра родительского элемента MyDatabase, который выбирает один над другим. Что-то вроде:

const db = new MyDatabase({ mode: 'admin' })
db.connect() // parent calls MyDatabaseAdmin.connect

Мне не нужен идеальный ответ, просто какое-то направление к тому, что я должен искать.

Спасибо.

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Если у них нет общего кода, то это действительно два отдельных класса. Вы, вероятно, даже не хотите, чтобы код администратора присутствовал в браузере, так как он все равно не может быть использован.

Вы могли бы иметь одну фабричную функцию, которая просматривает параметр администратора, создает экземпляр соответствующего объекта базы данных и возвращает его, но я не думаю, что даже понимаю, почему вы беспокоитесь об этом.

Просто попросите каждого клиента создать соответствующий объект БД. Если есть какой-либо общий код, вы можете иметь обе реализации, наследуемые от общей базы, и поместить общий код в базовый класс.

Верно! Я забыл упомянуть, но есть некоторый общий код ... соединение и аутентификация точно такие же, например. Вы знаете какой-либо шаблон дизайна, который идеально подходит для этого варианта использования? Должен ли я узнать о фабриках?

Я думаю, что общий базовый класс с наследованием решает проблему здесь. Это естественное место для размещения общего кода без необходимости включения серверного кода в клиентскую реализацию. Реализация браузера и реализация сервера будут подклассом, который присутствует только на их соответствующих платформах. Общий базовый класс будет присутствовать и использоваться в обоих местах.

У вас просто есть клиент создает экземпляр соответствующего листового класса, и общий код живет в базовом классе. Если вы хотите скрыть фактические конструкторы классов, вы можете использовать фабричную функцию (это просто простая функция, которая смотрит на условия, создает для вас подходящий объект и возвращает его), но я не уверен, что есть веские причины для использования заводская функция здесь. Вы бы включили только соответствующий листовой класс на платформе, для которой он предназначен, поэтому нет места, где вы могли бы использовать один или другой в том же коде.

0 голосов
/ 16 марта 2020

считаете ли вы, что у вас есть только ' пользователей '? тогда каждый пользователь может иметь ' роль ', которая будет либо пользователь , либо admin . Таким образом, на основе этой ' роли ' вы будете определять привилегии для каждого пользователя. Я считаю, что это решение проще для такого рода вещей, но дайте мне знать, если оно не соответствует вашему делу.

...