Добрый день.
Есть приложение, которое состоит из, по сути, 3-ех основных частей: 1. Пользователи 2. Устройства 3. Очередь команд
Допустим, сущности «пользователи» и «устройства» общаются с ПО по TCP. Сущность «Очередь команд» некий объект, который хранит в себе команды полученные от «пользователя», которые потом передаются в «устройство», «устройство» выполняет команду и результат помещает обратно в «Очередь» из которой потом «пользователь» забирает результат.
Попробовал изобразить это в виду UML диаграммы: https://ibb.co/rxGwdGj
Возможно что-то изобразил не правильно, поэтому вот краткое описание:
class ServerUser : public IServerUser
{
private:
IUser usersList;
IQueue *queue; // при создании объекта ServerUser передает указатель на объект Queue
public:
void newUser()
{
user = new User(this); // в объект User передаем ссылку на объект сервера
userList.append(user);
}
void sendCommand(int deviceId, string cmd)
{
queue->sendCommand(deviceId, cmd);
}
void gotAnswer(int userId, int string answer)
{
userList[userId]->gotAnswer(answer);
}
}
class User : public IUser
{
private:
IServerUser *server;
public:
void gotAnswer(answer)
{
// ...
}
void eventSendCommand()
{
// получено событие от пользователя, что нужно отправить команду
server->sendCommand(deviceId, cmd);
}
}
class Queue : public IQueue
{
private:
IServerUser *serverUser;
IServerDevice *serverDevice;
public:
void sendCommand(int deviceId, string cmd)
{
serverDevice->sendCOmmand(deviceId, cmd);
}
// аналогично для получения ответа
}
// классы ServerDevice и Device реализованы по подобию реализации ServerUser и User
Сейчас для того чтобы отправить команду, ответ на команду нужно вызывать метод сервера, который в свою очередь будет вызывать метод Queue. Если объект Queue в объекты User, Device, то тогда будет получаться меньше писанины, но так, по идее, нарушается слабая связанность классов User, Device и Queue. Какой вариант более предпочтителен?