设计模式--观察者模式

最近看设计模式,其中谈及到观察者模式.

可以理解为被观察者对外提供注册机制,观察者可以通过插入和移除实现订阅和取消订阅消息的功能,无论观察者有没有注册, 都不会影响被观察者发布消息.

而这在mmdetection中体现的很好.

举个例子来观察每天我的生活:

其中register_hook用来注册HOOK来判断是否要观察我的每天生活.

import sys
class HOOK:

    def before_getup(self, runner):
        print('{}:赖床30分钟'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)
    def after_getup(self, runner):
        print('{}:刷牙洗脸'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)
    def before_lunch(self, runner):
        print('{}:吃午饭之前上厕所'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)
    def after_lunch(self, runner):
        print('{}:吃完午饭午休30分钟'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)
    def before_dinner(self, runner):
        print('{}: 摸鱼30分钟'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)
    def after_dinner(self, runner):
        print('{}: 回家睡觉'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)

    def after_finish_work(self, runner, are_you_busy=False):
        if are_you_busy:
            print('{}:今天事贼多,还是加班吧'.format(sys._getframe().f_code.co_name))
        else:
            print('{}:今天没啥事,看部电影'.format(sys._getframe().f_code.co_name))
        print('==runner:', runner)

class Runner(object):
    def __init__(self, ):
        pass
        self._hooks = []

    def register_hook(self, hook):
        # 这里不做优先级判断,直接在头部插入HOOK
        self._hooks.insert(0, hook)

    def call_hook(self, hook_name):
        for hook in self._hooks:
            getattr(hook, hook_name)(self)

    def run(self):
        print('开始启动我的一天')
        self.call_hook('before_getup')
        self.call_hook('after_getup')
        self.call_hook('before_lunch')
        self.call_hook('after_lunch')
        self.call_hook('before_dinner')
        self.call_hook('after_dinner')
        self.call_hook('after_finish_work')
        print('睡觉算求')

runner = Runner()
hook = HOOK()
runner.register_hook(hook)
runner.run()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值