Как унифицировать вызов однотипных по смыслу, но разных по реализации методов? Например, нужно написать агрегатор сервисов рассылки смс-сообщений с сайта. У каждого сервиса есть свои api, в которых реализован некий метод а-ля send(собственно отправить сообщение). Но название этого метода и его сигнатура может меняться от сервиса к сервису. А нужно сделать так, чтобы в тех местах кода, где описывается бизнес-логика(БЛ) с использованием отправки сообщений использовался единый метод send(типа SmsSender::send()). Как правильно реализовать такое, какой паттерн подходит больше всего?

21 Авг 2019 в 07:02
245 +1
0
Ответы
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");

Таким образом, вы можете унифицировать вызов однотипных по смыслу, но разных по реализации методов с помощью паттерна "Стратегия".

20 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир