這可能有點長,但我儘量保持它儘可能小,並嘗試以最佳方式將其放入。使用觀察者模式來爲訂閱者建模通知
我有閱讀關於設計模式,發現觀察者模式非常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
我知道瑣碎的方式是可以做到的,但我可以做一些通過這裏使用觀察者模式更好?
注意:我不是試圖將問題適應設計模式,因爲它通常是皺眉。我只是想實現它爲*學習目的。我試圖尋找一些實現,但不成功到目前爲止
我的問題:我提出的,我知道我可以走近這個問題(上述僞代碼),但這樣有什麼,可以在這裏使用觀察者模式來實現更好?
感謝您的回覆。現在我可以至少看到關於事情如何粘在一起的更大的圖片,但是,我有一個小小的懷疑。對於任何大中型應用程序或流行的Web服務,我們可能會有很多用戶說50萬個例子。現在將所有論壇用戶始終保存在內存中的列表中是有意義的嗎?將新用戶添加到數據庫時會發生什麼? – anekix
你說得對,把他們留在記憶裏很可能是不合理的。在這種情況下,您可以保留其id的引用,並且只有在主題需要通知訂閱者時纔將其加載到內存中。有些'persistence'框架可以在調用時通過'Lazy Loading'把對象存儲到內存中來爲你處理。請參閱https://en.wikipedia.org/wiki/Lazy_loading – gimg1