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

21 Авг 2019 в 07:02
204 +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 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 706 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир