Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб. 3 ПиАПС.docx
Скачиваний:
0
Добавлен:
29.05.2025
Размер:
408.62 Кб
Скачать

Л а б о р а т о р н а я р а б о т а № 3

«Реализация одного из структурных паттернов проектирования»

Цель работы: Применение паттерна проектирования Composite (компоновщик)

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

class Component {

public:

virtual void add(Component*) {}

//virtual void remove(Component*) {}

//virtual void setPaidBaggageWeight(double) {}

virtual double getTotalBaggageWeight() { return 0.0; }

//virtual double getPaidBaggageWeight() { return 0.0; }

virtual string getName() { return ""; }

virtual void info() {}

virtual ~Component() {}

};

class Pilot : public Component {

string name;

public:

Pilot(string name) { this->name = name; }

string getName() override {

return name;

}

void info() override {

cout << "Пилот: " << name << "\n";

}

};

class Stewardess : public Component {

string name;

public:

Stewardess(string name) { this->name = name; }

string getName() override {

return name;

}

Void info() override {

cout << "Стюардесса: " << name << "\n";

}

};

class Passenger : public Component {

string name;

double totalBaggageWeight;

double paidBaggageWeight;

public:

Passenger(string name, double baggageWeight) {

this->name = name;

baggageWeight = (baggageWeight > 60) ? 60 : baggageWeight;

baggageWeight = (baggageWeight < 5) ? 5 : baggageWeight;

this->totalBaggageWeight = baggageWeight;

}

void setPaidBaggageWeight(double maxFreeBaggageWeight) {

double temp = (totalBaggageWeight - maxFreeBaggageWeight);

paidBaggageWeight = (temp > 0) ? temp : 0;

}

double getTotalBaggageWeight() override { return totalBaggageWeight; }

//double getPaidBaggageWeight() { return paidBaggageWeight; }

string getName() override {

return name;

}

void baggageRemoval() {

totalBaggageWeight = 5;

paidBaggageWeight = 0;

}

Void info() override {

cout << "Пассажир: " << name << ", "

"общий вес багажа: " << totalBaggageWeight << " кг, "

"вес оплачиваемого багажа: " << paidBaggageWeight << " кг" << endl;

}

};

class Group : public Component {

protected:

vector<Component*> people;

int countPassengers;

int maxCountPassengers;

const double maxBaggageWeight = 60;

const double minBaggageWeight = 5;

double maxFreeBaggageWeight;

int countCrewmembers;

public:

Group() {}

Group(int maxCountPassengers, double maxFreeBaggageWeight) {

this->maxCountPassengers = maxCountPassengers;

this->maxFreeBaggageWeight = maxFreeBaggageWeight;

}

Group(int countCrewmembers) {

this->countCrewmembers = countCrewmembers;

}

void add(Component* component) override {

people.push_back(component);

}

/*void add(Component* component) override {

if (dynamic_cast<Passenger*>(component) && countPassengers < maxCountPassengers) {

people.push_back(component);

countPassengers++;

}

else {

cout << "This isn't a passenger!" << endl;

}

}*/

/*

void remove(Component* component) {

auto it = std::remove(people.begin(), people.end(), component);

if (it != people.end()) {

delete* it; // Освобождение памяти

people.erase(it, people.end());

}

}

*/

double getTotalBaggageWeight() override {

double totalWeight = 0;

for (auto& person : people) {

totalWeight += person->getTotalBaggageWeight();

}

return totalWeight;

}

int getPeopleCount() {

return people.size();

}

vector<Component*> getPeople() {

return people;

}

};

class FirstClass : public Group {

public:

FirstClass() : Group(10, 60) {}

void add(Component* component) override {

Passenger* passenger = dynamic_cast<Passenger*>(component);

if (passenger && countPassengers < maxCountPassengers) {

people.push_back(passenger);

passenger->setPaidBaggageWeight(maxFreeBaggageWeight);

countPassengers++;

}

else if (dynamic_cast<Passenger*>(component) && countPassengers >= maxCountPassengers) {

cout << "\n\033[33mПассажир Первого класса " << component->getName() <<

": Максимальное количество пассажиров Первого класса: " << maxCountPassengers <<

"\033[0m" << endl;

}

else {

cout << "\n\033[33mЧлен экипажа " << component->getName() << ": Это не пассажир.\033[0m" << endl;

}

}

Соседние файлы в предмете Проектирование и архитектура программных систем