#include <iostream>
#include <memory>
#include <string>
class IMessageSender {
public:
virtual ~IMessageSender() = default;
virtual void sendMessage(const std::string& recipient,
const std::string& message) const = 0;
};
class EmailSender : public IMessageSender {
public:
void sendMessage(const std::string& recipient,
const std::string& message) const override {
std::cout << "[Email] Sending to " << recipient
<< ": " << message << std::endl;
}
};
class SmsSender : public IMessageSender {
public:
void sendMessage(const std::string& recipient,
const std::string& message) const override {
std::cout << "[SMS] Sending to " << recipient
<< ": " << message << std::endl;
}
};
class NotificationService {
std::unique_ptr<IMessageSender> sender_;
public:
explicit NotificationService(std::unique_ptr<IMessageSender> sender)
: sender_(std::move(sender)) {}
void notify(const std::string& recipient,
const std::string& message) const {
if (sender_) {
sender_->sendMessage(recipient, message);
}
}
};
int main() {
auto emailService = NotificationService(std::make_unique<EmailSender>());
emailService.notify("user@example.com", "Hello via Email!");
auto smsService = NotificationService(std::make_unique<SmsSender>());
smsService.notify("+123456789", "Hello via SMS!");
return 0;
}