观察者模式

观察者模式(有时又被称为发布(publish-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

观察者模式中包含以下几种对象类型:

  • 观察者(Observer):观察者将自己注册到被观察对象中,被观察对象将观察者存放在一个容器(Container)里。
  • 被观察对象(Subject):被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。

示例

# coding:utf-8
import weakref

class Subject(object):
    """被观察对象,使用列表存储所有观察者"""
    def __init__(self, name):
        """此处使用弱引用,当删除observer是,WeakSet也会自动删除对应对象"""
        self.name = name
        self._observers = weakref.WeakSet()


    def register_observer(self, observer):
        """订阅事件,相当于将观察者添加到列表中"""
        self._observers.add(observer)
        print "observer {0} now listening on {1}".format(observer.name, self.name)


    def notify_observers(self, msg):
        """遍历列表,发送消息给每一个观察者"""
        print("subject notifying observers about {}".format(msg,))
        for observer in self._observers:
            observer.notify(self, msg)


class Observer(object):
    def __init__(self, name):
        self.name = name

    def start_observing(self, subject):
        """订阅事件"""
        subject.register_observer(self)


    def notify(self, subject, msg):
        """通知观察者"""
        print "{0} get msg from {1} that {2}".format(self.name, subject.name, msg)

class_homework = Subject("class homework")
student1 = Observer("student 1")
student2 = Observer("student 2")

student1.start_observing(class_homework)
student2.start_observing(class_homework)

class_homework.notify_observers("result if out")
del student1
class_homework.notify_observers("20/20 passed this exam")

输出结果为:

observer student 1 now listening on class homework
observer student 2 now listening on class homework
subject notifying observers about result if out
student 1 get msg from class homework that result if out
student 2 get msg from class homework that result if out
subject notifying observers about 20/20 passed this exam
student 2 get msg from class homework that 20/20 passed this exam

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

聊聊Data Guard中的DG Broker(r10笔记第24天)

DG Broker是Oracle为Data Guard维护提供的一个很不错的工具,从我的实际使用来看,早期的版本中似乎大家都还是存在一定的思维定式,认为手工维护...

30340
来自专栏点滴积累

使用Ambari安装hadoop集群

      最近需要做些spark的工作,所以弄了几台dell7500就这么准备开始搭建集群,之前用过几台更破的台式机搭建过一次,折腾了半个月之久,终于成功搭建...

44360
来自专栏拂晓风起

Loader拉取图片,由于redirect重定向,导致策略文件无效 设置checkPolicyFile后还是无效:需要一个策略文件,但在加载此媒体时未设置 checkPolicyFile 标志

12960
来自专栏FreeBuf

开源版ZoomEye:基于Python的网络侦查框架 – IVRE

IVRE(又名DRUNK)是一款网络侦查框架,包括两个基于p0f和Bro的被动侦查模块和一个基于Nmap&Zmap的主动侦查模块,其功能类似于国内知道创宇公司推...

41770
来自专栏知识分享

六,ESP8266 TCP Client(基于Lua脚本语言)五,ESP8266 TCP服务器多连接

今天不知道是不是让我姐挺失望.......很多时候都不知道自己努力的方向对不对,,以后能不能带给家人最美好的期盼...... Init.lua 没啥改变,,就改...

46140
来自专栏cs

oracle12c,各种问题解决方案

近来重装了计算机(双系统windows10+ubuntu16),顺带着也把software升级一下,结果安装最新的oracle12c,出现了一系列问题,我不喜...

74840
来自专栏信安之路

RedTeam 技巧集合

1、利用目标用户使用的 user agent 来隐藏自身的恶意流量,比如像 Outlook 软件的 UA。

17820
来自专栏知识分享

八,ESP8266 文件保存数据(基于Lua脚本语言)

应该是LUA介绍8266的最后一篇,,,,,,下回是直接用SDK,,然后再列个12345.......不过要等一两个星期,先忙完朋友的事情 前面几篇 用AT指令...

43070
来自专栏知识分享

五,ESP8266 TCP服务器多连接(基于Lua脚本语言)

一些时间去准备朋友的元器件了... 接着写,,争取今天写完所有的文章,,因为答应了朋友下周5之前要做好朋友的东西 对于TCP大家在玩AT指令的时候有没有发现客户...

65070
来自专栏H2Cloud

支持插件的消息中间件【msg broker with plugin】

支持插件的消息中间件 msg broker with plugin Msg Broker概念: msg broker是实现application 之间互通讯的组...

57460

扫码关注云+社区

领取腾讯云代金券