#include <iostream>
#include <vector>
#include <memory>
class print_files_receiver {
public:
void print_common_files() {
std::cout << "print common files" << std::endl;
}
void print_special_files() {
std::cout << "print special files" << std::endl;
}
};
class print_command {
public:
print_command(print_files_receiver *ptr) : receiver_(ptr) {
}
virtual ~print_command() = default;
public:
virtual bool execute() = 0;
protected:
print_files_receiver *receiver_ = nullptr;
};
class print_common_files_command : public print_command {
public:
print_common_files_command(print_files_receiver *receiver) : print_command(receiver) {
}
public:
virtual bool execute() {
receiver_->print_common_files();
}
};
class print_special_files_command : public print_command {
public:
print_special_files_command(print_files_receiver *receiver) : print_command(receiver) {
}
public:
virtual bool execute() {
receiver_->print_special_files();
}
};
class office_worker {
public:
void set_command(print_command *command) {
missions.emplace_back(command);
}
void notify() {
for (auto cmd : missions) {
cmd->execute();
}
}
private:
std::vector<print_command *>missions;
};
int main() {
print_files_receiver receiver;
print_command *print_common_file_command = new print_common_files_command(&receiver);
print_command *print_special_file_command = new print_special_files_command(&receiver);
office_worker worker;
worker.set_command(print_common_file_command);
worker.set_command(print_special_file_command);
worker.notify();
delete print_common_file_command;
delete print_special_file_command;
return 0;
}