观察者模式

当对象之间有一对多关系我们会用到观察者模式。具体来说当多个对象依赖某个对象时,需要使用观察者模式。

比如,聊天室里系统向所有用户发送通知。

在观察者模式中分为被观察者和观察者,被观察者就是一对多中的一,观察者就是多,他们之间的关系就像下图一样,被观察者被观察者观察。

图源: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...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 实战:异步爬取之异步的简单使用

    首先,对于少量的请求(几百)我们不推荐使用异步,一般是成千上万的请求我们才使用异步,比如说爬取全站。

    渔父歌
  • python基础类型(三):可调用类型——函数和方法

    在 python中所有的类型都是对象,即使是 int,float这些其他语言中的基础类型在 python中也是以对象的形式存在,函数和方法也不例外。

    渔父歌
  • 前端:JavaScript闭包

    渔父歌
  • SpringMVC response返回参数绑定

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • 基于django的视频点播网站开发-step11-后台用户管理功能

    这是一个普通的视图类,通过get()和post()来完成用户添加的功能,get里面负责页面的展示,post里面负责逻辑处理。在get中,初始化form为User...

    山东程序员
  • NodeJS使用mssql连接SQLServer出现"Incorrect syntax near the keyword \'user\'."

    最近使用NodeJS的mssql模块连接SQLServer数据库出现了"Incorrect syntax near the keyword ‘user’."的错...

    ccf19881030
  • 广告小程序后端开发

    玩蛇的胖纸
  • shel脚本批量添加用户,首次登陆强制修改密码

    企业里常用到脚本来批量管理很多用户,这些也可以理解为自动化管理。为企业之后自动运维部署做准备。 #!/bin/bash #description:userad...

    BG彪
  • 如何优雅地实现分页查询

    分页功能是很常见的功能,特别是当数据量越来越大的时候,分页查询是必不可少的。实现分页功能有很多种方式,如果使用的ORM框架是mybatis的话,有开源的分页插件...

    黄泽杰
  • 史上最简单的druid开启AOP事务教程

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1149268

扫码关注云+社区

领取腾讯云代金券