2017-10-06 138 views
0

這可能有點長,但我儘量保持它儘可能小,並嘗試以最佳方式將其放入。使用觀察者模式來爲訂閱者建模通知

我有閱讀關於設計模式,發現觀察者模式非常intresting。我搜索了它的實際應用,並找到各種答案here。其中一個答案是:

每當發佈問題時,都會通知跟蹤相似主題的所有訂閱者。

我試圖如低於此係統在Python建模:使用Mongoengine ORM建模一個用戶和定義一個函數通知爲可用於通知用戶的用戶類

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   

我知道瑣碎的方式是可以做到的,但我可以做一些通過這裏使用觀察者模式更好?

注意:我不是試圖將問題適應設計模式,因爲它通常是皺眉。我只是想實現它爲*學習目的。我試圖尋找一些實現,但不成功到目前爲止

我的問題:我提出的,我知道我可以走近這個問題(上述僞代碼),但這樣有什麼,可以在這裏使用觀察者模式來實現更好?

回答

0

觀察者模式是一種軟件設計模式,其中一個對象, 稱爲主題,保持其家屬的名單,被稱爲 觀察員,並 通常是通過調用一個自動通知它們中的任何狀態變化他們的方法。

來源:Wikipedia - Observer Pattern

Observer是你User,但你仍然需要定義Subject而你的情況很可能會被稱爲Topic。本主題將在內部列表中保留其所有subscribers的列表。然後,當發生更新時,主題將通過循環遍歷每個訂閱者並調用其中的某些方法來通知其所有訂閱者。例如:

class Topic: 
    subscribers = [] 

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

    def notifySubscribers(self): 
     for subscriber : subscribers: 
      subscriber.notify(self) 
+0

感謝您的回覆。現在我可以至少看到關於事情如何粘在一起的更大的圖片,但是,我有一個小小的懷疑。對於任何大中型應用程序或流行的Web服務,我們可能會有很多用戶說50萬個例子。現在將所有論壇用戶始終保存在內存中的列表中是有意義的嗎?將新用戶添加到數據庫時會發生什麼? – anekix

+0

你說得對,把他們留在記憶裏很可能是不合理的。在這種情況下,您可以保留其id的引用,並且只有在主題需要通知訂閱者時纔將其加載到內存中。有些'persistence'框架可以在調用時通過'Lazy Loading'把對象存儲到內存中來爲你處理。請參閱https://en.wikipedia.org/wiki/Lazy_loading – gimg1