@stcmd04236

Как обобщить отправку уведомление точнее создать для них интерфейсы?

Добрый день! Возможно вопрос немножко не понятно но вот что пытаюсь сделать: Есть сервис который должен отправить уведомления в определенных событиях. Данные может быть отправлены и по электронной почте, sms или каким либо другим сервисом который указал пользователь из доступных ему. Для этого хочу создать интерфейс используя которого можно было описать любой сервис.

Так например если взять данные который отправляется то можно отличить следующие свойства который всем одинаково: тема, содержимое. Для электронной почты нужна адрес получателя, отправителя, тема, содержимое. Для телефона получатель, содержимое.
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
Можно использовать паттерн мост, brigde. https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D1%81%D...
Ну и примерно к такому виду все приведется:
$notifier = new Notifier(new Sms());
$notifier->send ....

$notifier = new Notifier(new Mail());
$notifier->send....

И дальше по аналогии. Классы реализаторы Sms и Mail должны реализовывать один и тот же интерфейс, в котором например будет метод send.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@IceJOKER
Web/Android developer
Первое , что пришло в голову:
1. Создать класс Notify, где записываются данные(куда отправлять, что отправлять и т.д.)
2. Создаем интерфейс ISender, с единственным методом send(Notify $notify).
3. Создаем разные классы для разных отправщиков - sms, email и т.д. и реализуем интерфейс из 2 пункта.
4. Можно создать фабричный класс/метод, куда передаем тип , который выбрал пользователь , а он возвращает нужный класс , либо просто через if/switch проверяете и создаете нужный класс(SmsSender, EmailSender и т.д.).
5. Т.к. все наши Sender-ы реализуют один и тот же интерфейс, то тупо вызываем метод send и передаем ему объект $notify

Это первое, что пришло в голову, уверен есть еще десятки разных вариантов
Ответ написан
Комментировать
@stcmd04236 Автор вопроса
Андрей , IceJOKER спасибо за ответ. Вот что сделал:

Создал следующие:

interface INotification
	{
		string Title { get; set; }

		string Content { get; set; }

		string From { get; set; }

		string To { get; set; }
	}

	interface ISender
	{
		INotification Notification { get; set; }

		SenderTypes Type { get; private set; }

		void Send ( );
	}

	public class SenderBridge
	{
		private ISender sender;

		public SenderBridge(ISender sender)
		{
			this.sender = sender;
		}

		public void Send(INotification notification)
		{
			this.sender.Notification = notification;
			this.sender.Send();
		}
	}

public static class NotificationSenders
	{
		private static List<ISender> list;

		public static void Send(this INotification source, SenderTypes type)
		{
			if(!Exist(type))
				throw new Exception(string.Format("Sender from {0} not found",type.ToString());

			var sender = Get(type);
			sender.Notification = source;
			sender.Send();
		}

		public static ISender Get(SenderTypes type)
		{
			return list.Where(s => s.Type.Equals(type)).FirstOrDefault();
		}

		public static bool Exist(SenderTypes type)
		{
			return list.Any(s => s.Type.Equals(type));
		}

		public static void AddSender(ISender sender)
		{
			if ( !list.Any(s => s.Type.Equals(sender.Type)) )
				list.Add(sender);
			else
				throw new Exception("Duplicate senders");
		}

		public static void Remove(SenderTypes type)
		{
			var sender = list.Where(s => s.Type.Equals(type)).FirstOrDefault();
			if ( sender != null )
				list.Remove(sender);
		}

		public static void Clear()
		{
			list.Clear();
		}

	}

        public enum SenderTypes
	{
		EMail,
		SMS
	}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы