S
S
stcmd042362016-07-25 12:53:35
OOP
stcmd04236, 2016-07-25 12:53:35

How to generalize sending a notification more precisely create interfaces for them?

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

Answer the question

In order to leave comments, you need to log in

3 answer(s)
Андрей, 2016-07-25
@stcmd04236

Можно использовать паттерн мост, 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.

I
IceJOKER, 2016-07-25
@IceJOKER

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

S
stcmd04236, 2016-07-25
@stcmd04236

Andrey , IceJOKER thanks for the answer. Here's what I did: I
created the following:

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
  }

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question