美文网首页
设计模式02观察者模式

设计模式02观察者模式

作者: 极光火狐狸 | 来源:发表于2017-05-16 09:59 被阅读33次

代码

# -.- 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. 为了交互对象之间的松耦合设计而努力。

参考

相关文章

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式

  • Android中涉及的模式

    我的Java设计模式-建造者模式 我的Java设计模式-观察者模式 重学设计模式之单例模式

网友评论

      本文标题:设计模式02观察者模式

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