博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python版设计模式之监听者模式
阅读量:7120 次
发布时间:2019-06-28

本文共 2031 字,大约阅读时间需要 6 分钟。

监听模式

又名观察者模式、发布/订阅模式、源-监听器(Source/Listener)模式,模式的核心是:设计时要区分谁是被观察者,谁是观察者。被观察者至少有三个方法,添加观察者、删除观察者、监听目标变化并通知观察者;观察者这至少包含一个方法,当接收到被观察者的通知时,做出相应的处理(即在被观察者的监听中调用)。

模式框架

'''观察者模式'''class Observable(object):    '''    被监听的对象,实现类需要具体增加被监听的资源    '''    def __init__(self):        self.__observers = []    @property    def observers(self):        return self.__observers    def has_observer(self):        return False if not self.__observers else True    def add_observer(self, observer):        self.__observers.append(observer)    def remove_observer(self, observer):        self.__observers.remove(observer)    def listener(self, obj=None):        for observer in self.__observers:            observer.update(self, obj)class Observer(object):    '''    观察者,当观察的对象发生变化时,依据变化情况增加处理逻辑    '''    def update(self, observable, obj):        pass

UML图

clipboard.png

示例

'''基于观察者模式,实现一个简单的消息队列,当队列中有消息时,将消息发送给监听者'''class MyQueue(Observable):    def __init__(self):        super().__init__()        self.__resource = []    def has_message(self):        return True if self.__resource else False    def queue_size(self):        return len(self.__resource)    def add_resource(self, res):        self.__resource.append(res)        print("新消息进入,推送...")        self.listener(obj=res)class MySubOdd(Observer):    def update(self, observable, obj):        if isinstance(observable, MyQueue) and int(obj) % 2 != 0:            print("I'm MySubOdd, Get Message {} from MyQueue.".format(obj))class MySubEven(Observer):    def update(self, observable, obj):        if isinstance(observable, MyQueue) and int(obj) % 2 == 0:            print("I'm MySubEven, Get Message {} from MyQueue.".format(obj))if __name__ == "__main__":    my_queue = MyQueue()        # 初始化一个队列    my_sub_odd = MySubOdd()     # 初始化奇数监听者    my_sub_even = MySubEven()   # 初始化偶数监听者    # 将两个监听者加入监听队列    my_queue.add_observer(my_sub_odd)    my_queue.add_observer(my_sub_even)    # 添加资源进队列    my_queue.add_resource("1")    my_queue.add_resource("3")    my_queue.add_resource("2")    my_queue.add_resource("4")

转载地址:http://ezbel.baihongyu.com/

你可能感兴趣的文章
go 入门学习笔记之 条件判断 if switch (七)
查看>>
Linux下清空用户登录记录和命令历史的方法
查看>>
Visual Sudio 复制窗体文件
查看>>
实例变量并不安全(java)
查看>>
修改系统文件(cookie、桌面、我的文档)位置
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
debian6 Redis+phpredis安装
查看>>
Google Auth+openssh
查看>>
NFS服务器配置及客户端挂载
查看>>
ELK(elasticsearch+logstash+kibana)开源日志分析平台搭建
查看>>
Debian 8.0桌面系统root用户登录和root用户自动登录
查看>>
Windows 8 新启动方式:混合启动(Hybrid Boot)
查看>>
*.manifest 文件
查看>>
要在jsp界面上显示一行三个控件
查看>>
我的linux学习之路-文件的创建于删除
查看>>
Linux日志分析
查看>>
ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr]
查看>>
发布/订阅模式
查看>>
RHCE证书的获得过程--1
查看>>