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