文档章节

设计模式02观察者模式

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:17
字数 477
阅读 1
收藏 0
点赞 0
评论 0

代码

# -.- coding:utf-8 -.-
# __author__ == 'zhengtong'
from __future__ import print_function


def exception_wrapper(func):
    def wrapper(self, *args, **kwargs):
        try:
            result = func(self, *args, **kwargs)
            if result is not None:
                return result
        except Exception:
            import sys, traceback
            ex_type, ex, tb = sys.exc_info()
            traceback.print_exception(ex_type, ex, tb)
            return False
        return True
    return wrapper


class Producer(object):

    def __init__(self):
        self.topic = {}

    @exception_wrapper
    def create_topic(self, topic):
        if topic not in self.topic:
            self.topic[topic] = []

    @exception_wrapper
    def publish(self, topic, data):
        self.create_topic(topic)
        if not self.topic[topic]:
            return '当前主题没有任何观察者/订阅者/消费者'
        self.notify_observers(topic, data)

    @exception_wrapper
    def subscribe(self, topic, *observers):
        self.create_topic(topic)
        for observer in observers:
            if observer not in self.topic[topic]:
                self.topic[topic].append(observer)

    @exception_wrapper
    def unsubscribe(self, topic, *observers):
        l = self.topic[topic]
        for observer in observers:
            l.pop(l.index(observer))

    @exception_wrapper
    def notify_observers(self, topic, data):
        for observer in self.topic[topic]:
            observer.get_message(data)


class SendMailObserver(object):

    def get_message(self, data):
        print('send mail to: ', data)


class WriteMailObserver(object):

    def get_message(self, data):
        print('write mail to: ', data)


class ProcessMailObserver(object):

    def get_message(self, data):
        print('ProcessMail mail: ', data)

if __name__ == '__main__':
    # 启动Producer服务
    producer = Producer()

    # 创建主题
    producer.create_topic('sss')
    producer.create_topic('bbb')

    # 注册观察者/订阅者/消费者
    send_mail_observer = SendMailObserver()
    write_mail_observer = WriteMailObserver()
    Process_mail_observer = ProcessMailObserver()
    producer.subscribe('send_mail', *[send_mail_observer,
                                      write_mail_observer,
                                      Process_mail_observer])

    # 查看每个队列有多少的consumer
    print('producer.topic: ', producer.topic)

    # 发布消息
    producer.publish('send_mail', '330356463@qq.com')

    # 移除观察者/订阅者/消费者
    producer.unsubscribe('send_mail', write_mail_observer)

    # 查看每个队列有多少的consumer
    print(producer.topic)

    # 查看现在总共有几个频道
    print(producer.topic.keys())


# 显示结果
producer.topic:  {'bbb': [], 'sss': [], 'send_mail': [<__main__.SendMailObserver object at 0x03492F50>, <__main__.WriteMailObserver object at 0x03492F70>, <__main__.ProcessMailObserver object at 0x03492F90>]}
send mail to:  330356463@qq.com
write mail to:  330356463@qq.com
ProcessMail mail:  330356463@qq.com
{'bbb': [], 'sss': [], 'send_mail': [<__main__.SendMailObserver object at 0x03492F50>, <__main__.ProcessMailObserver object at 0x03492F90>]}
['bbb', 'sss', 'send_mail']

 
 

模式总结

观察者模式强调的是松耦合,通过程序之间的强约定弱依赖实现通用场景的<发布/订阅>模型。

核心理念

当数据发生变化时执行回调函数(provide a callback for notification of events/changes to data).

模式类型

行为模式

设计原则
  1. 为了交互对象之间的松耦合设计而努力。

参考

本文转载自:http://www.jianshu.com/p/3ebf68fc0960

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2139
码字总数 82983
作品 0
程序员
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

Java经典设计模式-结构型模式-适配器模式(Adapter)

适配器模式 适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的...

Idea ⋅ 01/20 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

设计模式之禅(第2版).epub

【下载地址】 本书是设计模式领域公认的3本经典著作之一,“极具趣味,容易理解,但讲解又极为严谨和透彻”是本书的写作风格和方法的最大特点。第1版2010年出版,畅销至今,广受好评,是该领...

winter730 ⋅ 05/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部