python 观察者模式小demo

作者: ouyangbro | 来源:发表于2017-09-13 13:24 被阅读29次

目标:每一次天气数据变化的时候,主显示器更新数据,温度显示器只显示温度数据,并且把历史变化数据都展示出来。

思路:中间一个收发代理broker去处理订阅,发布。

broker.py

# coding=utf-8
from collections import defaultdict


class Broker(object):
    def __init__(self):
        self.route_table = defaultdict(list)

    def subscribe(self, topic, observer):
        if observer in self.route_table[topic]:
            return
        self.route_table[topic].append(observer)

    def publish(self, topic, *args, **kwargs):
        for observer in self.route_table[topic]:
            observer.update(*args, **kwargs)

observer.py

# coding=utf-8
import copy


class DisplayAll(object):
    def __init__(self):
        self.cached = []

    def update(self, dic):
        self.cached.append(copy.deepcopy(dic))
        self.display()

    def display(self):
        print '#' * 40 + ' ALL ' + '#' * 40
        if len(self.cached) < 1:
            print '暂无数据...'
            return

        dic = self.cached[-1]
        assert isinstance(dic, dict)
        for key, value in dic.iteritems():
            print key, ': ', value


class DisplayTemperature(object):
    def __init__(self):
        self.cached = []

    def update(self, dic):
        assert isinstance(dic, dict)
        self.cached.append(copy.deepcopy(dic))
        self.display()

    def display(self):
        print '#' * 40 + ' Temper ' + '#' * 40
        for dic in self.cached:
            for key, value in dic.iteritems():
                if key == 'temperature':
                    print key, ':', value

跑一下试试看:

# coding=utf-8
import time
from broker import Broker
from observer import DisplayAll, DisplayTemperature


if __name__ == '__main__':
    broker = Broker()

    broker.subscribe('Weather', DisplayAll())
    broker.subscribe('Weather', DisplayTemperature())

    # 初始化数据
    dic = {
        'clock': time.strftime("%Y-%m-%d %X", time.localtime()),
        'temperature': 20,
        'humidity': 60,
        'oxygen': 10
    }
    broker.publish('Weather', dic)

    # 更新数据
    dic = {
        'clock': time.strftime("%Y-%m-%d %X", time.localtime()),
        'temperature': 32,
        'humidity': 100,
        'oxygen': 34
    }
    broker.publish('Weather', dic)

结果:

#################### ALL ####################
clock :  2017-09-13 11:45:41
temperature :  20
oxygen :  10
humidity :  60
#################### Temper ####################
temperature : 20

#################### ALL ####################
clock :  2017-09-13 11:45:41
temperature :  32
oxygen :  34
humidity :  100
#################### Temper ####################
temperature : 20
temperature : 32

大体实现了以上的目标。
broker维护一个route_table,大概结构如下:

route_table = {
    '天气': [observer1, observer2],
    '财经': [observer1, observer3],
    'IT': [observer2, observer4]
}

每一次订阅,如新来一个observer5,它订阅了天气话题,route_table更新如下:

route_table = {
    '天气': [observer1, observer2, observer5],
    '财经': [observer1, observer3],
    'IT': [observer2, observer4]
}

如果天气话题更新,则数据更新后发布一下,broker会遍历通知到各个在天气下注册过的观察者,让它们各自update一下:

def publish(self, topic, *args, **kwargs):
    for observer in self.route_table[topic]:
        observer.update(*args, **kwargs)

同事玮哥对观察者的描述,觉得挺有趣,如下:

观察者嘛,就是把自己的眼睛给到每一个感兴趣的话题(Topic or Subject),话题更新后,会就捏一下手上有的眼睛。

以上

相关文章

  • 观察者模式_20190912(python)

    一、观察者模式介绍 二、观察者模式UML 三、python实现观察者模式(demo1、2) 1、demo1 """...

  • python 观察者模式小demo

    目标:每一次天气数据变化的时候,主显示器更新数据,温度显示器只显示温度数据,并且把历史变化数据都展示出来。 思路:...

  • 02 观察者模式

    基于util包的观察者模式demo

  • Javaの设计模式之观察者模式

    推荐阅读:《设计模式之禅》 Observer Pattern 设计模式之观察者模式(发布订阅模式) Demo gi...

  • Rxjava深入理解之自己动手编写Rxjava

    Demo的源码地址在 mini-rxjava, 有兴趣的可以下载源码来看. 从观察者模式说起 观察者模式,是我们在...

  • 2017-12-26

    今天黄老师讲解了python观察者模式,观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观...

  • 观察者模式demo

    主题类 观察者抽象类 观察者子类A 观察者子类B 测试类 运行结果 观察者A 更新了状态: 8观察者B 更新了状态...

  • Android中关于观察者模式的demo

    自己写的一个android中关于观察者模式的demo。关于观察者的定义,可以看另外一篇文章:Java设计模式之观察...

  • 设计模式《代理模式》

    引言   上一节我们讲了观察者模式,这回咱们说说代理模式。 示例地址   Demo 类图 代理模式的定义   为其...

  • 2017-12-27

    今天上午黄老师主要讲解他的项目,用python讲解了观察者模式。实现观察者模式的时候要注意,观察者和被观察对象之间...

网友评论

    本文标题:python 观察者模式小demo

    本文链接:https://www.haomeiwen.com/subject/hvpksxtx.html