大数据 爬虫Python AI Sqlpython模式设计思想

python设计模式(二十):观察者模式

2019-02-22  本文已影响56人  Python之战

观察者模式,核心抽象对象管理所有依赖他的其他类,并在设计中使其在发生变动时,主动通知并更新其他类;也叫模型-视图模式、源-收听者模式、从属者模式。

该模式必须包含两个角色:观察者和被观察对象。在刚才的例子中,业务数据是被观察对象,用户界面是观察者。观察者和被观察者之间存在“观察”的逻辑关联,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。

我们设计一种应用场景:当客户减少到阀值时,销售通知工厂减少生产、人力资源开始裁人,反之则增加

示例code:

class Observer:
    """观察者核心:销售人员,被观察者number数据"""
    def __init__(self):
        self._number = None
        self._department = []

    @property
    def number(self):
        return self._number

    @number.setter
    def number(self, value):
        self._number = value
        print('当前客户数:{}'.format(self._number))
        for obj in self._department:
            obj.change(value)
        print('------------------')

    def notice(self, department):
        """相关部门"""
        self._department.append(department)

class Hr:
    """人事部门"""
    def change(self, value):
        if value < 10:
            print("人事变动:裁员")

        elif value > 20:
            print("人事变动:扩员")

        else:
            print("人事不受影响")

class Factory:
    """工厂类"""
    def change(self, value):
        if value < 15:
            print("生产计划变动:减产")
        elif value > 25:
            print("生产计划变动:增产")
        else:
            print("生产计划保持不变")

if __name__ == '__main__':
    observer = Observer()
    hr = Hr()
    factory = Factory()
    observer.notice(hr)
    observer.notice(factory)
    observer.number = 10
    observer.number = 15
    observer.number = 20
    observer.number = 25

当前客户数:10
人事不受影响
生产计划变动:减产
------------------
当前客户数:15
人事不受影响
生产计划保持不变
------------------
当前客户数:20
人事不受影响
生产计划保持不变
------------------
当前客户数:25
人事变动:扩员
生产计划保持不变
------------------

其中实现检测值的核心方法是通过property将方法伪装成属性,封装了内部的逻辑处理,而这逻辑中就包含更新相关对象的方法。

image

使用场景:

上一篇 下一篇

猜你喜欢

热点阅读