实现观察者模式示例,添加观察者、目标及具体实现,增强代码可读性
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
"""
|
||||
实例:
|
||||
汤宝宝一时想不开,当了房产中介。
|
||||
一旦片区内有房东发布了新房源信息,他就会第一时间通知所有潜在租客。
|
||||
"""
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
# 抽象观察者类
|
||||
class Observer(ABC):
|
||||
@abstractmethod
|
||||
def update(self):
|
||||
pass
|
||||
|
||||
|
||||
# 抽象目标接口
|
||||
class Subject(ABC):
|
||||
@abstractmethod
|
||||
def attach(self, observer: Observer):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def detach(self, observer: Observer):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def notify(self):
|
||||
pass
|
||||
|
||||
|
||||
# 具体目标类
|
||||
class HousingAgency(Subject):
|
||||
def __init__(self):
|
||||
self._observers = []
|
||||
|
||||
def attach(self, observer: Observer):
|
||||
self._observers.append(observer)
|
||||
|
||||
def detach(self, observer: Observer):
|
||||
self._observers.remove(observer)
|
||||
|
||||
def notify(self):
|
||||
print("房产中介通知了所有租客。")
|
||||
for observer in self._observers:
|
||||
observer.update()
|
||||
|
||||
|
||||
# 具体观察者类
|
||||
class Tenant(Observer):
|
||||
def __init__(self, name: str):
|
||||
self.name = name
|
||||
|
||||
def update(self):
|
||||
print(f"租客{self.name}收到房源更新通知!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("============= 观察者模式 =============")
|
||||
|
||||
agency = HousingAgency()
|
||||
tenant1 = Tenant("小明")
|
||||
tenant2 = Tenant("小红")
|
||||
|
||||
print("小红和小明订阅了房产中介的房源信息。")
|
||||
agency.attach(tenant1)
|
||||
agency.attach(tenant2)
|
||||
|
||||
print("房源上新了!")
|
||||
agency.notify()
|
||||
|
||||
print("-----")
|
||||
print("小红不想再接收房源信息,退订了。")
|
||||
agency.detach(tenant2)
|
||||
print("又有新房源了!")
|
||||
agency.notify()
|
||||
|
||||
print("\n=========== 观察者模式结束 ===========")
|
||||
Reference in New Issue
Block a user