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

使用场景:

  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
  • 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
  • 一个对象必须通知其他对象,而并不知道这些对象是谁。
  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【学习难度:★★★☆☆,使用频率:★★★★★】直接出处:观察者模式梳理和学习:https://github.com...
    BruceOuyang阅读 1,573评论 1 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,984评论 1 15
  • 链接:https://github.com/WiKi123/DesignPattern作者: WiKi123(gi...
    树懒啊树懒阅读 3,653评论 0 2
  • 昨天晚上翻看QQ空间的说说,有一条是关于“外向孤独症的典型做法你中了几条”。我无意间点开,发现自己全中。 ...
    257b2c13741d阅读 264评论 0 0