python实现观察者设计模式

参考文章:
观察者模式 | 菜鸟教程
教程由java实现, 本文以python实现.功能相同.

1. 观察者模式实现效果

Subject类为主, 当subject对象的值改动时.发布通知到各个注册了的观察者对象当中. 观察者接受通知并分别输出值的二进制,十进制,十六进制.

2. 关键逻辑

  1. subject中维护一个观察者列表observers, 观察者主动注册, 通知时遍历列表.
  2. 观察者类继承于同一个基类. 接受通知时分别调用各子类的方法,即多态.

3. 实现代码

class Subject(object):
    def __init__(self):
        self.observers = []
        self.state = 0
    
    def getState(self):
        return self.state
    
    def setState(self, value):
        self.state = value
        self.notifyAllObservers()
    
    def attach(self, observer):
        self.observers.append(observer)
    
    def notifyAllObservers(self):
        for observer in self.observers:
            observer.update()
class Observer(object):
    # Subject
    def __init__(self, subject):
        self.subject = subject
        subject.attach(self)
    
    def update(self):
        pass

class BinaryObserver(Observer):
    def update(self):
        print("Binary String: "+ bin(self.subject.getState()))

class OctalObserver(Observer):
    def update(self):
        print("Octal String: "+ oct(self.subject.getState()))

class HexaObserver(Observer):
    def update(self):
        print("Hex String: "+ hex(self.subject.getState()))
subject = Subject()
HexaObserver(subject)
OctalObserver(subject)
BinaryObserver(subject)
print("First state change: 15")
subject.setState(15)
print("First state change: 10")
subject.setState(10)

输出结果:

First state change: 15
Hex String: 0xf
Octal String: 0o17
Binary String: 0b1111
First state change: 10
Hex String: 0xa
Octal String: 0o12
Binary String: 0b1010

学习笔记: 观察者模式与发布订阅模式的区别

关键: 存储观察者列表与发布通知的模块不同

观察者模式
发布订阅模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值