请用观察者模式实现如下订阅场景并测试。当热点新闻频道(NewsChannel类)中的新闻列表(top_list)更新时,要自动通知关注该频道的用户(Subaciber类)相关的变化。注意要先利用基类 Observer 和 Subject 进行观察者与被观察对象的建模以约定方法规范和基本数据结构,Newschannel和Subscrtber则分别继承上述基类来进一步针对订阅场景进行其体实现。
时间: 2024-03-25 20:36:20 浏览: 8
好的,下面是代码实现:
```python
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self):
pass
class Subject(ABC):
@abstractmethod
def register_observer(self, observer: Observer):
pass
@abstractmethod
def remove_observer(self, observer: Observer):
pass
@abstractmethod
def notify_observers(self):
pass
class NewsChannel(Subject):
def __init__(self):
self.top_list = []
self.observers = []
def register_observer(self, observer: Observer):
self.observers.append(observer)
def remove_observer(self, observer: Observer):
self.observers.remove(observer)
def notify_observers(self):
for observer in self.observers:
observer.update()
def update_top_list(self, new_top_list):
self.top_list = new_top_list
self.notify_observers()
class Subscriber(Observer):
def __init__(self, name):
self.name = name
def update(self):
print(f"{self.name} received the updated top news list.")
# 测试代码
if __name__ == '__main__':
news_channel = NewsChannel()
subscriber1 = Subscriber("Subscriber1")
subscriber2 = Subscriber("Subscriber2")
subscriber3 = Subscriber("Subscriber3")
news_channel.register_observer(subscriber1)
news_channel.register_observer(subscriber2)
news_channel.register_observer(subscriber3)
news_channel.update_top_list(["News1", "News2", "News3"])
news_channel.remove_observer(subscriber2)
news_channel.update_top_list(["News4", "News5", "News6"])
```
在这个代码实现中,我们定义了两个抽象类 Observer 和 Subject 来约定观察者和被观察者的基本方法规范和数据结构。然后,我们分别以 NewsChannel 和 Subscriber 类来继承上述抽象类,实现了针对订阅场景的具体体实现。在测试代码中,我们创建了一个 NewsChannel 对象,并向其注册了三个 Subscriber 对象。然后,我们通过调用 NewsChannel 对象的 update_top_list 方法来更新新闻列表,并自动通知所有关注该频道的用户。最后,我们还演示了如何取消一个订阅用户。