Python设计模式——观察者模式
需求:员工上班在偷偷看股票,拜托前台一旦老板进来,就通知他们,让他们停止看股票。
这里有两类人,一类是观察者,即员工,一类是通知者,即前台,员工在观察前台的状态,前台负责通知员工最新的动态。
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com' class Receptionist():
def __init__(self):
self.observes=[]
self.status=''
def attach(self,observe):
self.observes.append(observe)
def notify(self):
for observe in self.observes:
observe.update() class StockObserve():
def __init__(self,name,receptionist):
self.name=name
self.receptionist=receptionist
def update(self):
print '%s,%s停止看股票'%(self.receptionist.status,self.name) if __name__=='__main__':
receptionist=Receptionist()
observe1=StockObserve('张三',receptionist)
observe2=StockObserve('李四',receptionist)
receptionist.attach(observe1)
receptionist.attach(observe2) receptionist.status='老板来了'
receptionist.notify()
这里的两个类的耦合是非常大的,它们是相互依赖的。一方面是前台类的notify方法会调用股票观察者类的update方法,另一方面,观察者类会访问调用前台类的status属性来获取最新的动态。
当需求变动时,例如现在老板也可以是通知者,员工除了看股票,还会看nba,如果增加一个Boss类和NBAObserver类,这样这四个类的耦合就会非常紧密,后期维护将非常困难,所以当遇到这种紧耦合的情况时,就需要将它们耦合的部分抽象成一个父类,这样后期维护就会轻松很多
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
from abc import ABCMeta, abstractmethod class Subject():
__metaclass__ = ABCMeta
observers=[]
status=''
@abstractmethod
def attach(self,observer):
pass
@abstractmethod
def detach(self,observer):
pass
@abstractmethod
def notify(self):
pass class Observer():
__metaclass__ = ABCMeta
def __init__(self,name,sub):
self.name=name
self.sub=sub
@abstractmethod
def update(self):
pass class Boss(Subject):
def __init__(self):
pass
def attach(self,observer):
self.observers.append(observer) def detach(self,observer):
self.observers.remove(observer)
def notify(self):
for observer in self.observers:
observer.update() class StockObserver(Observer):
def update(self):
print '%s,%s停止看股票'%(self.sub.status,self.name)
class NBAObserver(Observer):
def update(self):
print '%s,%s停止看NBA'%(self.sub.status,self.name) if __name__=='__main__':
boss=Boss()
observe1=StockObserver('张三',boss)
observe2=NBAObserver('李四',boss)
boss.attach(observe1)
boss.attach(observe2)
boss.detach(observe2)
boss.status='我是老板,我来了'
boss.notify()
Python设计模式——观察者模式的更多相关文章
- python设计模式---行为型之观察者模式
比较常用咯~~ from django.test import TestCase from abc import ABCMeta, abstractmethod # 行为型设计模式---观察者模式 c ...
- 最全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实现观察者模式 前言 有时,我们希望在一个对象的状态改变时更新另外一组对象.在MVC模式中有这样一个非 常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据, ...
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- linkin大话设计模式--观察者模式
linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...
- python设计模式浅析
今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- Python设计模式 - UML - 对象图(Object Diagram)
简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...
随机推荐
- TCP/IP协议原理与应用笔记04:子网掩码
1. 子网掩码 是IP 参照物:分网段用的! 比如 192.168.0.1 和192.168.0.2(1).子网掩码为 255.255.255.0那么192.168.0.X 在同一个网段,能互相访问. ...
- android 下载instagram动态中图片的demo
最近迷上了刷instagram,里面的很多照片都特别喜欢,于是就想分享到朋友圈或者微博,奈何墙外不知墙内苦啊.于是只能想办法将它们保存到本地,既可以做壁纸也能分享给别人. 我发现每条ins的动态在ap ...
- CENTOS install summary
1 centos6.5 before version : first :ultraISO write into u disk,second: copy source iso file into u d ...
- js实现过滤重复字符和重复数组-javascript技巧
js实现过滤重复字符 <script type="text/javascript"> <!-- String.prototype.noRepeatStr=func ...
- 【转】为 XmlNode.SelectNodes 加上排序功能
测试资料: <Config> <Item a='/> <Item a='/> <Item a='/> <Item a='/> <Ite ...
- EL标签库
首先要导入jar包 jst1.jar standard.jar 在页面中引入标签库 <%@taglib uri="..." prefix=".."%& ...
- c#调用c++ dll(二)
当对c++几种调用方式有了解以后我们可以试着写个c++动态连接库了,我们现在来写个简单的c++求和函数并把它封装成dll,供以后的c#调用 我们写dll的时候,个人认为,要写就要把dll写好,写标准, ...
- kettle Row Normaliser(行转列)
表1 设置 表2
- sql 更新重复数据只取一条记录
select s.* from ( select *, row_number() over (partition by PersonnelAccount order BY Personnel ...
- 关于XML与类型Class的映射
我们知道数据的持久化是编程必须面对的问题.我们可以保存数据到数据库.Excel表.XML文件.TXT文件等等.那么我们编程中经常会遇到对Xml文件的操作.在http://www.cnblogs.com ...