需求:员工上班在偷偷看股票,拜托前台一旦老板进来,就通知他们,让他们停止看股票。

这里有两类人,一类是观察者,即员工,一类是通知者,即前台,员工在观察前台的状态,前台负责通知员工最新的动态。

#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设计模式——观察者模式的更多相关文章

  1. python设计模式---行为型之观察者模式

    比较常用咯~~ from django.test import TestCase from abc import ABCMeta, abstractmethod # 行为型设计模式---观察者模式 c ...

  2. 最全36种python设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  3. 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 ...

  4. python实现观察者模式

    python实现观察者模式 前言 有时,我们希望在一个对象的状态改变时更新另外一组对象.在MVC模式中有这样一个非 常常见的例子,假设在两个视图(例如,一个饼图和一个电子表格)中使用同一个模型的数据, ...

  5. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. linkin大话设计模式--观察者模式

    linkin大话设计模式--观察者模式 观察者模式定义了对象间的一对多依赖关系,让一个或者多个观察者观察一个对象主题.当主题对象的状态发生改变的时候,系统能通知所有的依赖于此对象的观察者对象,从而能自 ...

  7. python设计模式浅析

    今天简单聊聊python的设计模式,GOF设计模式(c++)和Head first design pattern(Java)是两本设计模式的经典,基本可以照搬在python上面,但是你会发现pytho ...

  8. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  9. Python设计模式 - UML - 对象图(Object Diagram)

    简介 对象图和类图的基本概念是类似的,可以看作类图在系统某一时刻的镜像,显示了该时刻系统中参与交互的各个对象以及它们之间的关系. 对象图的元素包括对象.链接.包,元素之间的关系和类图相似. 对象图建模 ...

随机推荐

  1. Folder and jar

  2. C#_IComparable实例 - 对象ID进行排序

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Comp ...

  3. Routes

    Routes Routing lets you create your own URL paths, based on the path you can load a closure or a con ...

  4. 0x800a1391-Microsoft Jscript "JSON未定义"

    本人在进行调试代码是遇到以下问题: 在运行到var result = JSON.parse(data);这句时,报错:JSON未定义.如下图:

  5. Android_listView

    package com.example.app5; import java.util.ArrayList; import java.util.HashMap; import java.util.Lis ...

  6. epoll讲解--转自”知乎“

    http://my.oschina.net/dclink/blog/287198 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套 ...

  7. C++获取文件长度

    ifstream fin("example.txt", ios::binary); fin.seekg(0, ios::end); // 设置指针到文件流尾部 streampos ...

  8. [转]修改maven本地仓库路径

    从eclipse中增加了maven2的插件之后,maven默认的本地库的路径是${user}/.m2/repository/下,一般windows用户的操作系统都安装在C盘,所以这个目录下的jar包比 ...

  9. IO流详解之代码详解

    前面呢已经发了一些理解,整理了注释,整体来说IO这里难度不是很大,代码呢没有详细敲,只写了一个大概总结的内容如下: /** 一切皆文件:文件是所有操作系统保存数据和处理逻辑的唯一方式:不管是.exe, ...

  10. zookeeper实现互斥锁

    简单的说,zookeeper就是为了解决集群环境中数据一致性的问题. 举个很简单栗子: 有一个变量A,分别存在于两台服务器中,某个程序需要用到变量A,就随机地访问其中一台服务器并取得变量A的值,对吧? ...