python设计模式---行为型之观察者模式
比较常用咯~~
from django.test import TestCase
from abc import ABCMeta, abstractmethod
# 行为型设计模式---观察者模式
class Subject:
def __init__(self):
self._observers = []
def register(self, observer):
self._observers.append(observer)
def notify_all(self, *args, **kwargs):
for observer in self._observers:
observer.notify(self, *args, **kwargs)
class ObserverA:
def __init__(self, subject):
subject.register(self)
def notify(self, subject, *args):
print(type(self).__name__, ':: Got ', args, ' From ', subject)
class ObserverB:
def __init__(self, subject):
subject.register(self)
def notify(self, subject, *args):
print(type(self).__name__, ':: Got ', args, ' From ', subject)
subject = Subject()
ob1 = ObserverA(subject)
ob2 = ObserverB(subject)
subject.notify_all('notification')
class NewsPublisher:
def __init__(self):
self._subscribers = []
self._latest_news = None
def attach(self, subscriber):
self._subscribers.append(subscriber)
def detach(self):
return self._subscribers.pop()
def subscribers(self):
return [type(x).__name__ for x in self._subscribers]
def notify_subscribers(self):
for sub in self._subscribers:
sub.update()
def add_news(self, news):
self._latest_news = news
def get_news(self):
return 'Got News: ', self._latest_news
class Subscriber(metaclass=ABCMeta):
@abstractmethod
def update(self):
pass
class SMSSubscriber:
def __init__(self, publisher):
self.publisher = publisher
self.publisher.attach(self)
def update(self):
print(type(self).__name__, self.publisher.get_news())
class EmailSubscriber:
def __init__(self, publisher):
self.publisher = publisher
self.publisher.attach(self)
def update(self):
print(type(self).__name__, self.publisher.get_news())
class AnyOtherSubscriber:
def __init__(self, publisher):
self.publisher = publisher
self.publisher.attach(self)
def update(self):
print(type(self).__name__, self.publisher.get_news())
news_publisher = NewsPublisher()
for Subscribers in [SMSSubscriber, EmailSubscriber, AnyOtherSubscriber]:
Subscribers(news_publisher)
print('Subscribers: ', news_publisher.subscribers())
news_publisher.add_news('Hello, world!')
news_publisher.notify_subscribers()
print('Detached: ', type(news_publisher.detach()).__name__)
print('Subscribers: ', news_publisher.subscribers())
news_publisher.add_news('My second news!')
news_publisher.notify_subscribers()
ObserverA :: Got ('notification',) From <__main__.Subject object at 0x0000000002A2BF28>
ObserverB :: Got ('notification',) From <__main__.Subject object at 0x0000000002A2BF28>
Subscribers: ['SMSSubscriber', 'EmailSubscriber', 'AnyOtherSubscriber']
SMSSubscriber ('Got News: ', 'Hello, world!')
EmailSubscriber ('Got News: ', 'Hello, world!')
AnyOtherSubscriber ('Got News: ', 'Hello, world!')
Detached: AnyOtherSubscriber
Subscribers: ['SMSSubscriber', 'EmailSubscriber']
SMSSubscriber ('Got News: ', 'My second news!')
EmailSubscriber ('Got News: ', 'My second news!')
python设计模式---行为型之观察者模式的更多相关文章
- 【python设计模式-创建型】工厂方法模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻 ...
- python设计模式---创建型之单例模式
数据结构和算法是基本功, 设计模式是最佳实现. 作为程序员,必须有空了就练一练哈. # coding = utf-8 """ # 经典单例 class Singleton ...
- Python设计模式 - 创建型 - 单例模式(Singleton) - 十种
对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...
- python设计模式---创建型之工厂模式
# coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...
- Python设计模式 - 总览(更新中...)
最近打算重构部分python项目,有道是"工欲善其事,必先利其器",所以有必要梳理一下相关设计模式.每次回顾基本概念或底层实现时都会有一些新的收获,希望这次也不例外. 本系列打算先 ...
- 最全36种python设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...
- python设计模式第2版
python设计模式第2版 目录 第1章 设计模式简介 1 1.1 理解面向对象编程 1 1.1.1 对象 2 1.1.2 类 2 1.1.3 方法 2 1.2 面向对象编程的主要概念 3 1.2.1 ...
- python——设计模式
设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...
- python设计模式之工厂模式
一.理解工厂模式 在面向对象编程中,术语“工厂”表示一个负责创建替他类型对象的类.通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法.客户端使用某些参数调用此方法,之后,工厂会据此创建所需类 ...
随机推荐
- HTML&CSS_基础01
一.预备知识: # 1. HTML5 是 W3C 与 WHATWG 合作的结果. W3C 指 World Wide Web Consortium,万维网联盟. WHATWG 指 Web H ...
- ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)
题目链接:https://nanti.jisuanke.com/t/38223 题意:有一堆火柴构成了一个加减法式子,你可以把火柴重新组合,要求数字个数和原来一样多,每个数字的位数和对应原数字位数一样 ...
- python图形用户
1)使用GUI 1.GUI:Graphical user interface 2.tkinter:GUI libary for Python自带的库 3.GUI:Example 2)Ubuntu18. ...
- codeblocks(其它软件)修改后缀文件的打开默认方式
- PLSQL 报错弹框乱码
PLSQL Developer下报错信息显示乱码问题 连接环境:win 7 数据库版本:oracle 11g 模拟一个错误,查看错误提示显示"????"乱码问题,如下: 检查: 1 ...
- vue-cli 项目踩坑 npm install 时出错
1.报错如下: 2.此时你执行npm run dev / npm run build 会报错如下 npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! v ...
- Alibaba Java开发手册索引规约学习笔记
最近一段时间再看阿里巴巴 Java开发手册索引规约,写篇帖子总结一下,索引规约内容如下 为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于MySQL官网提供的示例库employees,可通 ...
- Git打标签、还原到具体标签版本代码
1.打标签:(在需要合并的分支上先打一个标签,方便回滚) $ git tag 标签名 -----此标签将打在本地,还需要推送至远程仓库 $ git push origin 标签名 -----此步骤执行 ...
- hibernate自定义校验Valid
步骤: 1.定义注解: import javax.validation.Constraint; import javax.validation.Payload; import java.lang.an ...
- XSS绕过小结
0x00前言 我们友情进行XSS检查,偶然跳出个小弹窗,其中我们总结了一些平时可能用到的XSS插入方式,方便我们以后进行快速检查,也提供了一定的思路,其中XSS有反射.存储.DOM这三类,至于具体每个 ...