当对象之间有一对多关系我们会用到观察者模式。具体来说当多个对象依赖某个对象时,需要使用观察者模式。
比如,聊天室里系统向所有用户发送通知。
在观察者模式中分为被观察者和观察者,被观察者就是一对多中的一,观察者就是多,他们之间的关系就像下图一样,被观察者被观察者观察。
图源:https://blog.csdn.net/colinandroid/article/details/81113013
以聊天室为例,服务器只有一个是被观察者,用户有多个是观察者,服务器和用户之间的关系就是一对多关系。用户等待服务器的通知的过程就是观察者观察的过程,但是在这个关系里,服务器是占据主动的,因为总是服务器向用户推送消息,而不是用户主动向服务器请求消息。
这做可以避免无效请求,服务器是消息发送方,知道何时发送请求,而用户是消息接收方,用户永远也不知道什么时候会有消息到来。所以如果是用户主送请求消息的话就会出现大量无效请求,这样会给服务器造成很大的压力。
下面以聊天室为例写一段参考代码,语言使用 python: UML图如下:
服务器类:
class Server:
def __init__(self):
self.__user_list = []
def addUser(self, user):
"""
向用户列表(观察者列表)添加一个用户(观察者)
:user: 要添加的用户
"""
self.__user_list.append(user)
print("添加用户:"+user.name)
def notifyAll(self):
for user in self.__user_list:
user.notify("this is a notification.")
用户类:
class User:
def __init__(self, name):
self.__name = name
def notify(self, msg: str):
print(self.__name+"收到消息:"+msg)
@property
def name(self):
return self.__name
测试函数:
if __name__ == '__main__':
server = Server()
user_1 = User('user-1')
user_2 = User('user-2')
user_3 = User('user-3')
server.addUser(user_1)
server.addUser(user_2)
server.addUser(user_3)
server.notifyAll()
参考: 菜鸟教程-观察者模式:https://www.runoob.com/... CSDN-【设计模式】最常用的设计模式之一的观察者模式 :https://blog.csdn.net/colinandroid...