Architecture Net

       

Логика базовых классов


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

Метод Reserve (Резерв)

Основным методом класса Broker (Брокер) является метод Reserve (Резерв).

ReservationResult *Reserve(Reservation *res) // Резервирование


{
int unitid = res->Unit!d;
DateTime dt = res->Date; // Дата
int numDays = res->NumberDays;
ReservationResult *result = new ReservationResult;
// Проверить, находятся ли даты
// в пределах поддерживаемого диапазона
int day = dt.DayOfYear - 1;
if (day + numDays > MaxDay) // если (день + numDays> MaxDay)


{
result->Reservation!d = -1; // результат
result->Comment = "Dates out of range";
// результат-> Комментарий = "Даты вне диапазона";


return result; // результат }
// Проверить, доступны ли комнаты для всех дат
for (int i = day; i < day + numDays; i++)
{
if (numCust[i, unitid] >= units[unitid]->capacity)
// вместимость
{
result->Reservation!d = -1; // результат
result->Coiranent = "Room not available";
// результат-> Комментарий = "Комната не доступна";


return result; // результат
}
}
// Резервировать комнату для требуемых дат
for (int i = day; i < day + numDays; i++) n
umCust[i, unitid] += 1;
// Добавить резервирование (Add reservation)
// к списку резервирования,
// возвратить результат
AddReservation(res);
result->Reservation!d = res->Reservation!d; // результат


result->ReservationCost = // результат
units[unitid]->cost * numDays; // стоимость
result->Rate = units[unitid]->cost; // результат = стоимость;


result->Comment = "OK"; // результата Комментарий = "хорошо";
return result;
}

Метод Reserve (Резерв) разработан так, чтобы с его помощью можно было зарезервировать разные типы резервируемых объектов. Таким образом, объект Reservation (Резервирование), который хранится в списке резервируемых объектов, создается в классе, производном от Broker (Брокер), и передается в метод Reserve (Резерв) в качестве параметра. Например, объект HotelBroker резервирует объект HotelReservation и т.д. Потом создается объект ReservationResult, который и будет возвращен (поля Unitid, Date (Дата) и NumberDays наследуются из базового класса Reservation (Резервирование)).


ReservationResult *Reserve(Reservation *res) // Резервирование

{
int unitid = res->UnitId;
DateTime dt = res->Date; // Дата
int numDays = res->NumberDays;
ReservationResult *result = new ReservationResult;

Затем мы проверяем, попадают ли даты резервирования в определенный период времени, который поддерживается системой (чтобы облегчить задачу, возьмем период в один год). Для этой цели используем структуру DateTime из пространства имен System (Система). Если какая-то дата не входит в указанный период, будет выдано сообщение об ошибке.

// Проверить, лежат ли даты в пределах поддерживаемого диапазона
int day = dt.DayOfYear - 1;
if (day + numDays > MaxDay) // если (день + numDays> MaxDay)

{
result->Reservation!d = -1; // результат
result->Comment = "Dates out of range";
// результат-> Комментарий = "Даты вне диапазона";

return result; // результат }

Потом нужно для каждого из запрашиваемых дней проверить, доступен ли этот ресурс, то есть, не будет ли число резервирований превышать объем ресурса (гостиницы). Мы сделаем это с помощью массива numCust. Первый индекс этого двумерного массива определяет конкретную дату, а второй — идентификационный код резервируемого объекта (Обратите внимание на то, что поля и методы названы именами, которые описывают их суть, например, HotelBroker).

// Проверить, доступны ли комнаты для всех дат
for (int i = day; i < day + numDays; i++)
{
if (numCust[i, unitid] >= units[unitid]->capacity)
// вместимость
{
result->Reservation!d = -1; // результат
result->Comment = "Room not available";
// результат-> Комментарий = "Комната не доступна";

return result; // результат
}
}

Далее нужно зарезервировать номер на указанный период времени, увеличив количество клиентов в numCust на единицу в каждый из дней, на которые клиент делает запрос.

// Резервировать комнату для требуемых дат
for (int i = day; i < day + numDays; i++)
numCust[i, unitid] += 1;

Наконец, мы добавляем резервирование к списку резервирований и возвращаем результат.



// Добавить резервирование к списку резервирований
// и возвратить результат
AddReservation(res);
result->Reservation!d = res->Reservation!d; // результат

result->ReservationCost = // результат
units[unitid]->cost * numDays; // стоимость
result->Rate = units[unitid]->cost;
// результат = стоимость;
result->Comment = "OK";
// результат-> Комментарий = "хорошо";
return result;
}

Список резервирований и резервируемых объектов

Класс Broker (Брокер) также содержит список резервирований и резервируемых объектов. Для нашей реализации в виде массивов мы реализуем только методы добавления (Add), а в последующих версиях примера рассмотрим, как удалять элементы из списка.

void AddReservation(Reservation *res) // Резервирование

{
reservations[nextReservation++] = res; // резервирование
}
void AddUnit(Reservabie *unit)
{
units[nextUnit++] = unit;
}

CompEbook.ru Железо, дизайн, обучение и другие


Содержание раздела