Как унифицировать вызов однотипных по смыслу, но разных по реализации методов? Например, нужно написать агрегатор сервисов рассылки смс-сообщений с сайта. У каждого сервиса есть свои api, в которых реализован некий метод а-ля send(собственно отправить сообщение). Но название этого метода и его сигнатура может меняться от сервиса к сервису. А нужно сделать так, чтобы в тех местах кода, где описывается бизнес-логика(БЛ) с использованием отправки сообщений использовался единый метод send(типа SmsSender::send()). Как правильно реализовать такое, какой паттерн подходит больше всего?
В данном случае, уместно использовать паттерн "Стратегия". Этот паттерн позволяет определить семейство алгоритмов, инкапсулировать их и обеспечить их взаимозаменяемость.
Для решения проблемы унификации вызовов методов отправки сообщений различных сервисов, можно создать интерфейс SmsSender, в котором будет объявлен метод send. Затем для каждого сервиса создать конкретный класс, реализующий этот интерфейс и содержащий свою реализацию метода send, соответствующую API данного сервиса.
После этого можно создать класс-агрегатор, который будет принимать в качестве параметра объект типа SmsSender и вызывать у него метод send. Таким образом, вся бизнес-логика с отправкой сообщений будет использовать единый метод send интерфейса SmsSender, при этом не зависеть от конкретной реализации отправки сообщений.
Примерная реализация на PHP:
interface SmsSender { public function send($message); } class Service1SmsSender implements SmsSender { public function send($message) { // Реализация отправки сообщения через сервис 1 } } class Service2SmsSender implements SmsSender { public function send($message) { // Реализация отправки сообщения через сервис 2 } } class SmsAggregator { private $sender; public function __construct(SmsSender $sender) { $this->sender = $sender; } public function send($message) { $this->sender->send($message); } } // Использование $service1Sender = new Service1SmsSender(); $aggregator = new SmsAggregator($service1Sender); $aggregator->send("Hello from Service 1");
Таким образом, вы можете унифицировать вызов однотипных по смыслу, но разных по реализации методов с помощью паттерна "Стратегия".
В данном случае, уместно использовать паттерн "Стратегия". Этот паттерн позволяет определить семейство алгоритмов, инкапсулировать их и обеспечить их взаимозаменяемость.
Для решения проблемы унификации вызовов методов отправки сообщений различных сервисов, можно создать интерфейс SmsSender, в котором будет объявлен метод send. Затем для каждого сервиса создать конкретный класс, реализующий этот интерфейс и содержащий свою реализацию метода send, соответствующую API данного сервиса.
После этого можно создать класс-агрегатор, который будет принимать в качестве параметра объект типа SmsSender и вызывать у него метод send. Таким образом, вся бизнес-логика с отправкой сообщений будет использовать единый метод send интерфейса SmsSender, при этом не зависеть от конкретной реализации отправки сообщений.
Примерная реализация на PHP:
interface SmsSender {public function send($message);
}
class Service1SmsSender implements SmsSender {
public function send($message) {
// Реализация отправки сообщения через сервис 1
}
}
class Service2SmsSender implements SmsSender {
public function send($message) {
// Реализация отправки сообщения через сервис 2
}
}
class SmsAggregator {
private $sender;
public function __construct(SmsSender $sender) {
$this->sender = $sender;
}
public function send($message) {
$this->sender->send($message);
}
}
// Использование
$service1Sender = new Service1SmsSender();
$aggregator = new SmsAggregator($service1Sender);
$aggregator->send("Hello from Service 1");
Таким образом, вы можете унифицировать вызов однотипных по смыслу, но разных по реализации методов с помощью паттерна "Стратегия".