
Л а б о р а т о р н а я р а б о т а № 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;
}
}