設計模式之——觀察者模式

當對象之間有一對多關係我們會用到觀察者模式。具體來說當多個對象依賴某個對象時,需要使用觀察者模式。

比如,聊天室裏系統向所有用戶發送通知。

在觀察者模式中分爲被觀察者和觀察者,被觀察者就是一對多中的一,觀察者就是多,他們之間的關係就像下圖一樣,被觀察者被觀察者觀察。
圖源: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…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章