Python实现的Observer Pattern

题记:

设计模式是需要不断的巩固的,尤其日常工作中使用C编码,很少涉及模式的工作。我一直认为程序员是一份需要长久经验积累的职业,但是如果不注重学习和总结,这种积累多数只能落实到虚无的所谓“管理”,暗暗寄希望能够谋求一份不用编码的管理岗,而这完全不是我所希望的。

正文:

最近因为部门调整,学习时间较多,利用这段时间抽空把Python又拿出来学习一下,借此机会也复习一下设计模式。下面使用Python简单实现一下Observer Pattern,希望对大家有所帮助。

#Version: 0.1

#Author: Walle Fu

class Account(object):

def __init__(self,id,name,balance):

self.ID = id

self.name = name

self.__balance = balance

self.observers = set()

def __del__(self):

for ob in self.observers:

ob.close()

del self.observers

def register(self,observer):

self.observers.add(observer)

def unregister(self,observer):

self.observers.remove(observer)

def notify(self):

for ob in self.observers:

ob.update()

def withdraw(self,amt):

self.__balance -= amt

self.notify()

def getBalanceValue(self):

return self.__balance

import weakref

class AccountObserver(object):

accountDict = {}

def __init__(self, theaccount):

#self.accountref = weakref.ref(theaccount) # Create a weakref

theaccount.register(self)

if theaccount.ID not in AccountObserver.accountDict:

AccountObserver.accountDict[theaccount.ID]= weakref.ref(theaccount)

else:

print "Error>> Account Id conflict, please recheck it."

def __del__(self):

for id in AccountObserver.accountDict:

acc = AccountObserver.accountDict[id]() # Get account

if acc: # Unregister if still exists

acc.unregister(self)

def update(self):

for id in AccountObserver.accountDict:

if id:

print "ID=", id, ", Name=", AccountObserver.accountDict[id]().name, \

", Balance=", AccountObserver.accountDict[id]().getBalanceValue()

def close(self, id):

if id in AccountObserver.accountDict:

print "ID=", id, ", Account no longer in use"

acc = AccountObserver.accountDict[id]()

if acc:

acc.unregister(self)

del AccountObserver.accountDict[id]

def add(self, theAccount):

theAccount.register(self)

if theAccount.ID not in AccountObserver.accountDict:

AccountObserver.accountDict[theAccount.ID]= weakref.ref(theAccount)

else:

print "Error>> Account Id conflict, please recheck it."

a = Account(‘0001‘,‘Tom‘,1000.00)

b = Account(‘0002‘,‘Jimmy‘,2000.00)

a_ob = AccountObserver(a)

a_ob.update()

a_ob.add(b)

a_ob.update()

a_ob.close(‘0001‘)

a_ob.update()

b.withdraw(100)

a.withdraw(100)

PS:

我一直在强化的一些技能(C++,Python,重构,设计模式,模式识别算法),在现在的工作中完全无用武之地,但我一直不希望这些技能荒废掉。也许我有一些不思进取,始终不肯逃出来主动寻求一些改变,在现有的“安逸”状态迷茫着。人们常说“男怕入错行”,还真有一些道理,我这个学计算机的,毕业后一直在通信圈里混,现在想改变也有很多的困境,即将毕业的同学一定要慎重选择好第一份工作。

Python实现的Observer Pattern,布布扣,bubuko.com

时间: 2024-10-15 12:27:19

Python实现的Observer Pattern的相关文章

设计模式之二:观察者模式(Observer Pattern)

先看下观察者模式的定义: The Observer Pattern defines a one-to-many denpendency between objects so that when one object changes state, all of its dependents are notified and updated automatically.:观察者模式定义了对象间一对多依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新. 观察者模式又叫发布-

[Design Pattern] Observer Pattern 简单案例

Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口.BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口. Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者. 代码实现

设计模式(二)The Observer Pattern 观察者模式

问题引入 生成一个公告板显示当时的天气状况,当天气状况发生改变的时候公告板能够实时的更新. 模式定义 定义对象之间的一对多的依赖.当一个对象改变状态时,它的全部依赖者都会自己主动收到通知并自己主动更新. 认识模式 该模式在生活中是非经常见的.想想生活中的各种各样的检測系统,报警系统,一旦有重要事件发生时,有关系统总能及时的收到通知.这就是观察者模式. 问题解决 关于观察者模式,java实际上给了我们内置的支持(能够看出该模式还是非经常常使用的吧!)可是我们经常会自己实现. 为什么呢?我们后面会给

设计模式之Observer Pattern

Declaration 首先声明, 本篇blog的内容是参考Design pattern FAQ Part 2 (Design pattern training series)这篇博文写的, 图片也是来自这篇博客. 部分是翻译, 加上自己的理解形成这篇博文. 希望和大家一起学习设计模式, 共同进步. Scene for Observer Pattern 举个例子说明在什么情况下会使用观察者模式,比如说一个网站,有订阅的功能,读者在提交订阅申请的时候会写入自己的邮件地址.那么每当这个网站有新内容更

Learning JavaScript Design Patterns The Observer Pattern

The Observer Pattern The Observer is a design pattern where an object (known as a subject) maintains a list of objects depending on it (observers), automatically notifying them of any changes to state. When a subject needs to notify observers about s

Head First 之 Design Pattern(二):Observer Pattern

观察者模式是最常用的设计模式之一,[对象之间多对一的依赖关系,当一个对象发生变化时,其会通知所有依赖它的对象].拿订阅报纸和发行报社打比方,报社采集到news制作新的报纸,派送给订阅的客户,以此把最新的消息告知客户.所以,出版社 + 订阅者 = 观察者模式. 这种一对多的关系,也即"一个"主题."多个"观察者能够使得观察者仅仅了解主题推送的消息但不知晓其中的细节,而主题握有观察者列表但不干涉到观察者的个人隐私.所以,它们之间相互有交互,但不紧密,不清楚对方的细节.改

设计模式 - 观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove

设计模式 - 观察者模式(Observer Pattern) Java内置 使用方法

观察者模式(Observer Pattern) Java内置 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 观察者模式(observer pattern)详解, 参见: http://blog.csdn.net/caroline_wendy/article/details/26583157 Java内置的观察者模式, 是通过继承父类, 实现观察者模式的几个主要函数: Observerable(可被观

设计模式-观察者模式(Observer Pattern)

今天看了看观察者模式,有点小小的体会,从以下3点说明之 : 1.看一下经典的观察者模式图 2.讲个故事,说一下逻辑 有一个男人(Subject),他通过一定的手段(attach)拥有了3个女人(Observer):老婆(concreteObserver1),情人(concreteObserver2),小3(concreteObserver3).这3个女人都不知情,但是都想知道男人的月收入情况.而月收入需要通过工资卡(concreteSubject)来体现.所以,每当发工资(setState)时,