监听模式

监听模式:在对象间定义一种一对多的依赖关系,当这个对象状态发生变化时,所有依赖它的对象都会被通知并自动更新。
个人理解:被监听者的行为会动态的反馈到监听者。

生活中的监听模式:美国总统发了一个twitter,说跟我们习大大电话通话非常愉快,而后这两天的股票价格涨幅非常好看。假设我在炒股,持有了1000股恒生电子,成本价为60.00元。我设定了一个消息通知,当股票价格达到68.00的时候,短信通知;当价格接近68.00的时候,比如还差两个点的时候(68*0.8),app推送通知。这个如何用监听模式实现呢?
在这个案例中,股票价格为被监听者,消息短信通知与app推送通知可以理解为股票价格的监听者。

from abc import ABCMeta, abstractmethod


class Observer(metaclass=ABCMeta):
    """监听者抽象类"""
    @abstractmethod
    def listen_price(self, price):
        pass


class Observable:
    """被监听者"""
    def __init__(self):
        self.__listeners = []   # 监听者对象
        self.price = 60.00     # 被监听者

    def set_stock_price(self, price):
        self.price = price
        self.notice()

    def add_listener(self, listener):
        self.__listeners.append(listener)

    def notice(self):
        for listener in self.__listeners:
            listener.listen_price(self.price)


class AppPushService(Observer):
    """APP消息推送监听者"""
    def listen_price(self, price):
        if 68.00 > price >= 68.00 * 0.8:
            print("Be Attention. Stock price is up to %f. Push notice to your phone." % price)


class SMSService(Observer):
    """短信推送监听者"""
    def listen_price(self, price):
        if price >= 68.00:
            print("Be Attention. Stock price is up to %f. Send SMS to your phone." % price)

if __name__ == "__main__":
    observable = Observable()
    app_push_service = AppPushService()
    observable.add_listener(app_push_service)
    sms_service = SMSService()
    observable.add_listener(sms_service)

    observable.set_stock_price(price=67.00)
    observable.set_stock_price(price=69.00)

如上,定义了一个抽象类Observer,拥有一个抽象方法listen_price,该方法能够针对股票价格的变化,做出相应的操作。被监听者类Observable拥有三个主要方法,一个是添加监听者对象方法add_listener,一个是设定股票价格的方法set_stock_price(实际情况下应该是从行情获取股票价格方法),一个是通知监听者对象的方法notice。当股票价格变动时,调用通知方法notice,告诉监听者,现在股票的价格,监听者根据股价的高低,确认是短信通知信息还是app消息推送;上述模拟还有很多不合理之处,比如:达到预期价格时,短信通知后,是否要移除该监听者等,大家将就下。

你可能感兴趣的:(python学习)