码迷,mamicode.com
首页 > 编程语言 > 详细

Python设计模式——观察者模式

时间:2014-10-20 23:00:58      阅读:351      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   for   sp   div   on   

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

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

#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设计模式——观察者模式

标签:style   blog   color   io   os   for   sp   div   on   

原文地址:http://www.cnblogs.com/Xjng/p/4038931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!