Python基础教程

第一章: 环境搭建,安装Python

第二章: 挑选一款趁手的IDE

第三章: 计算机基础知识

第四章: 命令行基础知识

第五章: 从全局把握Python

第六章: Python语言基础

第七章: Python流程控制

第八章: Python数据类型与运算

第九章: Python字符串类型

第十章: Python列表类型

第十一章: Python元组类型

第十二章: Python字典类型

第十三章: Python集合类型

第十四章: Python函数处理

第十五章: Python文件处理

第十六章: Python面向对象

第十七章: Python异常处理

第十八章: Python模块处理

第十九章: Python高级编程

第二十章: Python项目实战

首页 > Python基础教程 > 第十六章: Python面向对象 > 16.11节: 程序实战-观察者模式

16.11节: 程序实战-观察者模式

薯条老师 2022-12-08 10:46:09 23170 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6


16.11.1 观察者模式简介

观察者模式是一种设计模式,关于Python常用的设计模式,可系统学习薯条老师写的这系列教程http://chipscoco.com/?cate=81。观察者模式是这样的一种模式,它定义了对象间的一种一对多的依赖关系,当一个对象(主题)的状态发生改变时,则所有依赖于它的对象(观察者)都会得到通知并被自动更新。

举个很简单的例子: 对于关注了薯条老师的微信公众号的用户来说,公众号与关注者就是多对一的依赖关系,当公众号推文成功时,所有关注者都会收到这条推文消息。

16.11.2 观察者模式与发布订阅模式

观察者模式解决了被观察者对象和观察者对象的紧耦合问题,也即,如果不使用观察者模式,通常的实现是将状态耦合在观察者对象的内部。

observer.png

发布订阅模式是对观察者模式的推广,在主题和观察者之间引入了一个中间层。有了中间层以后,主题的状态一旦变更,消息被直接发送给中间层,而非观察者。在实际开发中,通常使用消息队列来做发布订阅模式中的中间层。

subscribe.png

16.11.4 实现观察者模式

# __author__ = 薯条老师,微信公众号:薯条编程

"""
观察者模式定义了对象间的一种一对多的依赖关系。
观察者的四种角色:
(1) Subject:抽象主题类 ,用来提供添加。删除,通知观察者的抽象接口
(2) Concrete Subject:具体的主题子类,用来实现抽象主题中的抽象接口
(3) Observer:抽象观察者类 ,用来定义一个抽象的行为
(4) Concrete Observer:具体的观察者子类,实现抽象观察者的抽象接口,当主题状态变更时,
会自动调用该接口
"""

import abc
"""
(1) 定义一个名为公众号的抽象主题类,该抽象基类包含三个抽象接口:
add_user:添加已关注的用户
notify: 状态变更时,通知所有已关注的用户阅读  
"""

class OfficialAccount(abc.ABC):
    @abc.abstractmethod
    def add_user(self, user):
        pass
        
        
    @abc.abstractmethod
    def notify(self):
        pass

                
"""
(2) 定义一个名为微信公众号的主题子类
"""
class WechatOfficialAccount(OfficialAccount):
    def __init__(self):
        self.__users = []
        self.__message = None
        
        
    def add_user(self, user):
        self.__users.append(user)
        
        
    def notify(self):
        if self.__message is not None:
            [user.read(self.__message) for user in self.__users]
            
            
    def push(self, message):
        self.__message = message
        self.notify()
        self.__message = None
        
        
"""
(3) 定义一个抽象观察者类User,该抽象基类包含一个抽象接口:
read: 阅读推文
"""
class User(abc.ABC):
    @abc.abstractmethod
    def read(self, message):
        pass
        
        
"""
(4) 定义一个具体观察者子类WechatUser
"""
class WechatUser(User):
    def __init__(self, name):
        self.__name = name
        
        
    def read(self, message):
        print("{} received message:{}".format(self.__name, message))
        
        
if __name__ == "__main__":
    wechatOfficialAccount = WechatOfficialAccount()
    kitty = WechatUser("kitty")
    lisa = WechatUser("Lisa")
    wechatOfficialAccount.add_user(kitty)
    wechatOfficialAccount.add_user(lisa)
    wechatOfficialAccount.push("欢迎来到单身狗俱乐部")

16.11.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:



欢迎 发表评论: