• 12.Python_行为型模式_观察者模式


    1.定义

    12
    定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
    角色抽象发布者:(Subject)
    具体发布者:(ConcreteSubject)
    抽象观察者:(Obeserver)
    具体观察者:(ConcerteObserver)
    优点1,观察者和被观察者是抽象耦合的. 2,建立一套触发机制。
    缺点1,如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
    2,如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
    3,观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化
    应用场景一个抽象模型有两个方面,其中一个方面依赖于另一个方面.将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
    一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
    一个对象必须通知其他对象,而并不知道这些对象是谁

    2.示例

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    from abc import ABCMeta, abstractmethod
    
    
    # 抽象观察者
    class Observer(metaclass=ABCMeta):
    
        @abstractmethod
        def update(self, notice):
            ...
    
    
    # 抽象发布者
    class Notice(metaclass=ABCMeta):
    
        def __init__(self):
            self.staff_list = []
    
        def attach(self, staff):
            self.staff_list.append(staff)
    
        def detach(self, staff):
            self.staff_list.remove(staff)
            staff.company_info = None
    
        def notify(self):
            for item in self.staff_list:
                item.update(self)  # 注意点1:item和self
    
    
    # 抽象发布者
    class Company(Notice):
        """
          1.继承Notice通知类,实现对那些需要通知的员工进行增删改查
          2.定义自己需要发布的信息
          3.每设置一次信息就需要通知一次所有的在公司的员工
          """
    
        def __init__(self, company_info=None):
            super(Company, self).__init__()
            self.__company_info = company_info
    
        @property
        def company_info(self):
            return self.__company_info
    
        @company_info.setter  # 注意点2
        def company_info(self, data):
            self.__company_info = data
            self.notify()
    
    
    # 具体观察者
    class ChineseStaff(Observer):
    
        def __init__(self):
            self.company_info = None
    
        def update(self, notice: Company):
            self.company_info = notice.company_info
    
    
    class ForeignStaff(Observer):
        def __init__(self):
            self.company_info = None
    
        def update(self, notice: Company):
            self.company_info = f"翻译为英文:{notice.company_info}"
    
    
    if __name__ == '__main__':
        staff1 = ChineseStaff()
        staff2 = ChineseStaff()
        staff3 = ForeignStaff()
    
        company = Company()
        company.attach(staff1)
        company.attach(staff2)
        company.attach(staff3)
        print("begin")
        print(staff1.company_info)
        print(staff2.company_info)
        print(staff3.company_info)
        print("end")
        company.company_info = "公司明天放假"
        print(staff1.company_info)
        print(staff2.company_info)
        print(staff3.company_info)
        company.detach(staff1)
        company.company_info = "公司明天发工资"
        print(staff1.company_info)
        print(staff2.company_info)
        print(staff3.company_info)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
  • 相关阅读:
    vue3 + vite 安装配置及项目创建
    【转载】DC-DC自举电容(BOOT)几个问题
    23种设计模式(十七)观察者模式(阁瑞钛伦特软件-九耶实训)
    Stream流式编程,让代码变优雅
    AcWing 799. 最长连续不重复子序列——算法基础课题解
    HDU1232 畅通工程(并查集)
    基于 STP 的可靠网络配置
    代码随想录二刷 Day48
    企业媒体信息发布系统,一键发布省时省力
    【Linux】基础IO
  • 原文地址:https://blog.csdn.net/weixin_44689630/article/details/126458725