观察者模式以及Python3的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_35085676/article/details/79541684

何为观察者模式

例子引出问题

现在有一颗苹果树,以及两个人,一个是负责种树的人,一个是负责吃苹果的人。

  • 如果苹果树病了,种树的人要去治疗树,否则什么也不干;
  • 如果树结果了,吃苹果的人要去吃,否则什么也不干;

那么如果苹果树的状态发生变化,种树者和食果者都要去得知树的状态,决定自己是否该行动。但是,两个人都不可能知道什么时候树产生变化,而时时刻刻去查看树的变化显然是不理想的。

解决方法

而观察者模式即使用来解决这个问题的。
系统中,苹果树作为被观察者,人作为观察者,即人会观察苹果树的状态(实际上是苹果树会将自己状态变化告知给人)。
作为被观察者,苹果树要有以下功能:

  1. 苹果树将要对自己负责的人放入自己观察者列表中,即实现registerObserver(self,observer)方法
  2. 当苹果树状态改变时(苹果树自然知道自身状态什么时候发生改变),会对自己的观察者列表的人发一条消息推送,即实现notifyObservers(self)方法
  3. 当不在需要某个人观察自己时(即状态改变后不用通知Ta),从列表中删除该观察者,即实现removeObserver(self,observer)方法

作为观察者,人要有以下功能:

  1. 当苹果树告知自己树状态改变后,自身应该由此做些什么,实现一个update()方法

如此一来,人无需时时刻刻去看树的状态,却不会渎职。

实现

先来实现观察者和被观察者的接口:

#观察者
class Observer:
    def update(self,stat):
        return

    def display(self):
        return

#被观察者
class Observed:
    def registerObserver(self,observer):
        return

    def removeObserver(self,observer):
        return

    def notifyObservers(self):
        return

接着,具体实现被观察者植物类:

class plant(Observed):
    def __init__(self):
        self.observers = []
        self.status = 'new'
        return

    def registerObserver(self,observer):
        self.observers.append(observer)
        return

    def removeObserver(self,observer):
        self.observers.remove(observer)
        return

    def notifyObservers(self):
        for item in self.observers:
            item.update(self.status)
        return

    def statusChanged(self):
        self.notifyObservers()

    def setStatus(self,status):
        self.status = status
        self.statusChanged()

以及种植者和食用者类:

class planter(Observer):
    def __init__(self,plant):
        self.plant = plant
        self.doing = 'nothing'
        plant.registerObserver(self)
        return

    def update(self,stat):
        self.doing = 'work' if stat == 'ill' else 'nothing'
        self.display()
        return

    def display(self):
        print('I am planter,my plant now is %s,i doing %s.' % \
              (self.plant.status,self.doing))
        return

class eater(Observer):
    def __init__(self,plant):
        self.plant = plant
        self.doing = 'nothing'
        plant.registerObserver(self)
        return

    def update(self,stat):
        self.doing = 'work' if stat == 'ok' else 'nothing'
        self.display()
        return

    def display(self):
        print('I am eater,my plant now is %s,i doing %s.' % \
              (self.plant.status,self.doing))
        return

完整代码:

# coding=utf-8


#观察者
class Observer:
    def update(self,stat):
        return

    def display(self):
        return

#被观察者
class Observed:
    def registerObserver(self,observer):
        return

    def removeObserver(self,observer):
        return

    def notifyObservers(self):
        return


class plant(Observed):
    def __init__(self):
        self.observers = []
        self.status = 'new'
        return

    def registerObserver(self,observer):
        self.observers.append(observer)
        return

    def removeObserver(self,observer):
        self.observers.remove(observer)
        return

    def notifyObservers(self):
        for item in self.observers:
            item.update(self.status)
        return

    def statusChanged(self):
        self.notifyObservers()

    def setStatus(self,status):
        self.status = status
        self.statusChanged()

class planter(Observer):
    def __init__(self,plant):
        self.plant = plant
        self.doing = 'nothing'
        plant.registerObserver(self)
        return

    def update(self,stat):
        self.doing = 'work' if stat == 'ill' else 'nothing'
        self.display()
        return

    def display(self):
        print('I am planter,my plant now is %s,i doing %s.' % \
              (self.plant.status,self.doing))
        return

class eater(Observer):
    def __init__(self,plant):
        self.plant = plant
        self.doing = 'nothing'
        plant.registerObserver(self)
        return

    def update(self,stat):
        self.doing = 'work' if stat == 'ok' else 'nothing'
        self.display()
        return

    def display(self):
        print('I am eater,my plant now is %s,i doing %s.' % \
              (self.plant.status,self.doing))
        return


if __name__ == '__main__':
    tree = plant()
    display = planter(tree)
    tree.setStatus('ill')
    display = eater(tree)
    tree.setStatus('ok')
    tree.setStatus('unknow')

运行结果:

I am planter,my plant now is ill,i doing work.
I am planter,my plant now is ok,i doing nothing.
I am eater,my plant now is ok,i doing work.
I am planter,my plant now is unknow,i doing nothing.
I am eater,my plant now is unknow,i doing nothing.

猜你喜欢

转载自blog.csdn.net/baidu_35085676/article/details/79541684
今日推荐