использование шаблона наблюдателя для моделирования уведомлений подписчикам

Это может быть немного длинный вопрос, но я стараюсь сделать его как можно меньше и постараюсь изложить его как можно лучше.

Я читал о шаблонах проектирования и нашел шаблон наблюдателя очень интересным. я искал его практическое применение и нашел различные ответы здесь. один из этих ответов был:

Каждый раз, когда публикуется вопрос, уведомляются все подписчики, которые следят за темами, представляющими аналогичный интерес.

Я попытался смоделировать эту систему на Python, как показано ниже:

используя Mongoengine ORM для моделирования пользователя и определения функции notify для класса User, который можно использовать для уведомления пользователя:

from mongoengine import *

connect('tumblelog')


# User model
class User(Document):
        email = StringField()
        first_name = StringField()
        last_name = StringField()
        topic_subscribed = StringField()

        def notify(self):
                print "email sent to user :{} {} {}".format(self.first_name, self.last_name, self.email)
                print "user was subsacribed to: {}".format(self.topic_subscribed)






# simulate publishing of an article of a particular topic
while True:
        x = raw_input(">>>")
        print "question of {} topic published".format(x)

        # How to notify all users that are subscribed to the topic ?????
        # naive way :
        # def some_aynchronous_function():
        #       1) find all users from db that are subscribed to the topic
        #       2) notify each user by looping through all of them          

Я знаю тривиальный способ сделать это, но могу ли я сделать что-то лучше, используя здесь шаблон наблюдателя?

ПРИМЕЧАНИЕ. Я не пытаюсь приспособить проблему к шаблону проектирования, поскольку это обычно не одобряется. Я просто пытаюсь реализовать его в * учебных целях. Я пробовал искать некоторые реализации, но пока безуспешно

МОЙ ВОПРОС: я представил свой способ решения проблемы (псевдокод выше), но есть ли что-нибудь, что можно сделать лучше, используя здесь шаблон наблюдателя?


person anekix    schedule 06.10.2017    source источник


Ответы (1)


Шаблон наблюдателя - это шаблон проектирования программного обеспечения, в котором объект, называемый субъектом, поддерживает список своих зависимых элементов, называемых наблюдателями, и автоматически уведомляет их о любых изменениях состояния, обычно вызывая один из их методов.

источник: Википедия - шаблон наблюдателя

Ваш Observer - это ваш User, но вам все равно нужно определить свой Subject, который в вашем случае, вероятно, будет называться Topic. В этой теме будет храниться список всех своих subscribers во внутреннем списке. Затем, когда происходит обновление, тема уведомляет всех своих подписчиков, перебирая каждого из них и вызывая какой-нибудь их метод. Например:

class Topic:
    subscribers = []

    def addSubscriber(self, subscriber):
        subscribers.append(subscriber)

    def notifySubscribers(self):
        for subscriber : subscribers:
            subscriber.notify(self)
person gimg1    schedule 07.10.2017
comment
Спасибо за ответ. теперь я могу по крайней мере увидеть более широкую картину того, как все будет работать вместе, однако у меня есть небольшое сомнение. Для любого приложения среднего и большого размера или популярного веб-сервиса у нас может быть много пользователей, например, 500 000. теперь имеет ли смысл постоянно хранить всех пользователей тезисов внутри списка в памяти? Что происходит, когда новые пользователи добавляются в базу данных? - person anekix; 07.10.2017
comment
Вы правы, хранить их в памяти, скорее всего, было бы неправдоподобно. В этом случае вы могли бы вместо этого сохранить ссылку на их идентификаторы и загружать их в память только тогда, когда теме необходимо уведомить подписчиков. Некоторые persistence фреймворки могут справиться с этим за вас, Lazy Loading помещая объекты в память при вызове. См. en.wikipedia.org/wiki/Lazy_loading. - person gimg1; 08.10.2017