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

本文介绍了观察者模式的概念,包括其定义、优缺点和应用场景,并通过两个具体的示例展示了如何使用该模式。第一个示例是员工通知系统,当公司信息变化时,所有员工都会收到通知。第二个示例是一个数据化程序,它演示了如何在数值变化时自动更新其二进制和十六进制表示。通过这两个实例,读者可以深入理解观察者模式在实时数据同步和更新中的作用。
摘要由CSDN通过智能技术生成

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)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值