111
11
#include <iostream>
#include <cstring>
/** Абстрактный музыкант - не является обязательной составляющей паттерна, введен для упрощения кода */
class Musician {
const char* name;
public:
Musician(const char* name) {
this->name = name;
}
virtual ~Musician() {}
protected:
void output(const char* text) {
std::cout << this->name << " " << text << "." << std::endl;
}
};
/** Конкретные музыканты */
class Vocalist: public Musician {
public:
Vocalist(const char* name): Musician(name) {}
void singCouplet(const int coupletNumber) {
char* text = strdup("спел куплет №");
strncat(text, std::to_string(coupletNumber).c_str(), 15);
output(text);
}
void singChorus() {
output("спел припев");
}
};
class Guitarist: public Musician {
public:
Guitarist(const char* name): Musician(name) {}
void playCoolOpening() {
output("начинает с крутого вступления");
}
void playCoolRiffs() {
output("играет крутые риффы");
}
void playAnotherCoolRiffs() {
output("играет другие крутые риффы");
}
void playIncrediblyCoolSolo() {
output("выдает невероятно крутое соло");
}
void playFinalAccord() {
output("заканчивает песню мощным аккордом");
}
};
class Bassist: public Musician {
public:
Bassist(const char* name): Musician(name) {}
void followTheDrums() {
output("следует за барабанами");
}
void changeRhythm(const char* type) {
char* text = strdup("перешел на ритм ");
strncat(text, type, 15);
strncat(text, "a", 15);
output(text);
}
void stopPlaying() {
output("заканчивает играть");
}
};
class Drummer: public Musician {
public:
Drummer(const char* name): Musician(name) {}
void startPlaying() {
output("начинает играть");
}
void stopPlaying() {
output("заканчивает играть");
}
};
/** Фасад, в данном случае - знаменитая рок-группа */
class BlackSabbath {
Vocalist* vocalist;
Guitarist* guitarist;
Bassist* bassist;
Drummer* drummer;
public:
BlackSabbath() {
vocalist = new Vocalist("Оззи Осборн");
guitarist = new Guitarist("Тони Айомми");
bassist = new Bassist("Гизер Батлер");
drummer = new Drummer("Билл Уорд");
}
void playCoolSong() {
guitarist->playCoolOpening();
drummer->startPlaying();
bassist->followTheDrums();
guitarist->playCoolRiffs();
vocalist->singCouplet(1);
bassist->changeRhythm("припев");
guitarist->playAnotherCoolRiffs();
vocalist->singChorus();
bassist->changeRhythm("куплет");
guitarist->playCoolRiffs();
vocalist->singCouplet(2);
bassist->changeRhythm("припев");
guitarist->playAnotherCoolRiffs();
vocalist->singChorus();
bassist->changeRhythm("куплет");
guitarist->playIncrediblyCoolSolo();
guitarist->playCoolRiffs();
vocalist->singCouplet(3);
bassist->changeRhythm("припев");
guitarist->playAnotherCoolRiffs();
vocalist->singChorus();
bassist->changeRhythm("куплет");
guitarist->playCoolRiffs();
bassist->stopPlaying();
drummer->stopPlaying();
guitarist->playFinalAccord();
}
};
int main() {
std::cout << "OUTPUT:" << std::endl;
BlackSabbath* band = new BlackSabbath();
band->playCoolSong();
return 0;
}
/**
* OUTPUT:
* Тони Айомми начинает с крутого вступления.
* Билл Уорд начинает играть.
* Гизер Батлер следует за барабанами.
* Тони Айомми играет крутые риффы.
* Оззи Осборн спел куплет №1.
* Гизер Батлер перешел на ритм припевa.
* Тони Айомми играет другие крутые риффы.
* Оззи Осборн спел припев.
* Гизер Батлер перешел на ритм куплетa.
* Тони Айомми играет крутые риффы.
* Оззи Осборн спел куплет №2.
* Гизер Батлер перешел на ритм припевa.
* Тони Айомми играет другие крутые риффы.
* Оззи Осборн спел припев.
* Гизер Батлер перешел на ритм куплетa.
* Тони Айомми выдает невероятно крутое соло.
* Тони Айомми играет крутые риффы.
* Оззи Осборн спел куплет №3.
* Гизер Батлер перешел на ритм припевa.
* Тони Айомми играет другие крутые риффы.
* Оззи Осборн спел припев.
* Гизер Батлер перешел на ритм куплетa.
* Тони Айомми играет крутые риффы.
* Гизер Батлер заканчивает играть.
* Билл Уорд заканчивает играть.
* Тони Айомми заканчивает песню мощным аккордом.
*/