文档章节

设计模式02观察者模式

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:17
字数 477
阅读 1
收藏 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
博文 2634
码字总数 82983
作品 0
程序员
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
08/27
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
0
0
设计模式.策略模式

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

技术小胖子
2017/11/08
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

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

Carson_Ho
04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

HBase 表修复在线方式和离线方式

一、在线修复 1.1 使用检查命令 $ ./bin/hbase hbck 该命令可完整修复 HBase 元数据信息;存在有错误信息会进行输出; 也可以通过如下命令查看详细信息: $ ./bin/hbase hbck -details 1.2 ...

Ryan-瑞恩
16分钟前
0
0
redis 系列二 -- 常用命令

1.基础命令 info ping quit save dbsize select flushdb flushall 2.键命令 2.1 set 直接赋值 set a a 2.2 get 取值 get a 2.3 exists 是否存在 exists a 2.4 expire 设置剩余时间 秒 expire......

imbiao
47分钟前
1
0
php foreach

<?php// 数组的引用$a=array(1,2,3,4,5);foreach($a as $key=>&$value){$value=$value*2;}print_r($a);echo " $key -------------------$value\r\n";/** * ...

小张525
55分钟前
1
0
12-利用思维导图梳理JavaSE-多线程

12-利用思维导图梳理JavaSE-多线程 主要内容 1.线程概念 2.线程开发 3.线程的状态 4.线程的同步和死锁 5.Java5.0并发库类 QQ/知识星球/个人WeChat/公众号二维码 本文为原创文章,如果对你有一...

飞鱼说编程
今天
0
0
JAVA集合之ArrayList

一、前言 Java 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类,JAVA常用的集合接口有4类,分别是: Collection:代表一组对象,每一个对象都是它的子元素 Set:不包含重复元素...

木木匠
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部