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设计模式之工厂模式
一.理解工厂模式 在面向对象编程中,术语“工厂”表示一个负责创建替他类型对象的类.通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法.客户端使用某些参数调用此方法,之后,工厂会据此创建所需类 ...
随机推荐
- 【学习笔记】python
1. len( s ) 返回对象(字符.列表.元祖等)的长度或项目个数. >>>str = "runoob" >>> len(str) # ...
- Nginx与前端开发
Nginx与Node.js "Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能,时常用于服务端的反向代理和负载均衡." 作为前 ...
- Linux(Centos)设置ip
一.Linux(Centos7)安装完毕后,重启电脑后,输入用户名(root),密码(**********). 在命令行中输入nmtui命令.选择Edit a connection,选择对应的链接端口 ...
- JS基础-第1天
JavaScript 第一天笔记 学习目标 了解Javascript的作用及其组成 掌握变量的使用,知道变量的作用是存储数据 掌握变量的命名规范 掌握 JavaScript 的 5 种简单数据类型 掌 ...
- C++预编译头文件 – stdafx.h
预编译头文件的由来 也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含.可是,这到底是为什么呢?预编译头有什么用呢? 咱们从头文件的编译原理讲起.其实头文件并不神秘,其在编译时的作用,就是把 ...
- js关于“变量提升、作用域、私有作用域等知识点”高级解题思路
var i = 2, x = 5;var fn = function (x) { x += 3; return function (y) { console.log(( ...
- 分页之 skip(pageindex*(index-1).take(size).Tolist();
grdView.DataSource = Select().Skip(pageSize * (start - 1)).Take(rows).ToList();这个分页性能上并不高下面是我的分页 1 2 ...
- mysql—增删改查语句总结
关于MySQL数据库——增删改查语句集锦 一.基本的sql语句 CRUD操作: create 创建(添加) read 读取 update 修改 delete 删除 .添加数据 ,'n001','201 ...
- 关于接口(Interface)
接口,其实是指类之间约定的协议,可以包含方法.属性.事件和索引: 接口成员不允许使用访问修饰符号(public.private.protected.internal),所有的接口成员都是公共的. 接口 ...
- H5富文本编辑器之初始化用于编辑的DOM-遁地龙卷风
使用H5的全局属性contenteditable可以让DOM元素及其子元素变的可编辑 <div contenteditable id="editor"> </di ...