首页 > 后端开发 > Python教程 > Python学习之观察者模式

Python学习之观察者模式

little bottle
发布: 2019-04-28 10:41:10
转载
1893 人浏览过

本篇文章主要讲述了Python的观察者模式,代码具有一定参考价值,感兴趣的盆友可以了解一下,希望对你能有所帮助。

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

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#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类,这样这四个类的耦合就会非常紧密,后期维护将非常困难,所以当遇到这种紧耦合的情况时,就需要将它们耦合的部分抽象成一个父类,这样后期维护就会轻松很多


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

#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学习之观察者模式的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
python - ubuntu16.04 lxml的报错
来自于 1970-01-01 08:00:00
0
0
0
有办法在PHP里写Python吗?
来自于 1970-01-01 08:00:00
0
0
0
python scrapy爬虫错误
来自于 1970-01-01 08:00:00
0
0
0
centos7 编译安装 Python 3.5.1 失败
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板