请用观察者模式实现如下订阅场景并测试。当热点新闻频道(NewsChannel类)中的新闻列表(top_list)更新时,要自动通知关注该频道的用户(Subaciber类)相关的变化。注意要先利用基类 Observer 和 Subject 进行观察者与被观察对象的建模以约定方法规范和基本数据结构,Newschannel和Subscrtber则分别继承上述基类来进一步针对订阅场景进行其体实现。
时间: 2024-03-23 08:44:04 浏览: 97
好的,我会根据你的要求来实现观察者模式的订阅场景。
首先,我们需要定义两个基类:Observer 和 Subject。Observer 类用于定义观察者的基本属性和方法,Subject 类用于定义被观察对象的属性和方法。
以下是 Observer 类的实现:
```python
class Observer:
def __init__(self):
self._id = None
def update(self, subject):
pass
```
Observer 类中只有一个属性 _id,用于标识观察者的唯一标识符。update() 方法用于在被观察对象状态改变时更新观察者状态。
接下来,我们定义 Subject 类:
```python
class Subject:
def __init__(self):
self._observers = []
def attach(self, observer):
self._observers.append(observer)
def detach(self, observer):
self._observers.remove(observer)
def notify(self):
for observer in self._observers:
observer.update(self)
```
Subject 类中有一个属性 _observers,用于保存所有观察者。attach() 方法用于将观察者添加到观察者列表中,detach() 方法用于从观察者列表中删除观察者,notify() 方法用于通知所有观察者状态改变。
接下来,我们定义 NewsChannel 类,它继承自 Subject 类:
```python
class NewsChannel(Subject):
def __init__(self):
super().__init__()
self._top_list = []
@property
def top_list(self):
return self._top_list
def set_top_list(self, top_list):
self._top_list = top_list
self.notify()
```
NewsChannel 类中有一个属性 _top_list,用于保存最新的新闻列表。set_top_list() 方法用于设置新的新闻列表,并在状态改变时通知所有观察者。
最后,我们定义 Subscriber 类,它继承自 Observer 类:
```python
class Subscriber(Observer):
def __init__(self, name):
super().__init__()
self._id = name
def update(self, subject):
if isinstance(subject, NewsChannel):
print(f"Subscriber {self._id} received the latest news: {subject.top_list}")
```
Subscriber 类中有一个属性 _id,用于保存观察者的唯一标识符。update() 方法用于在被观察对象状态改变时更新观察者状态。
现在我们可以进行测试了。假设我们有两个用户 A 和 B,他们都订阅了新闻频道:
```python
if __name__ == '__main__':
channel = NewsChannel()
subscriber_a = Subscriber('A')
subscriber_b = Subscriber('B')
channel.attach(subscriber_a)
channel.attach(subscriber_b)
channel.set_top_list(['News1', 'News2', 'News3'])
channel.detach(subscriber_b)
channel.set_top_list(['News4', 'News5'])
```
在上面的测试代码中,我们首先创建了一个新闻频道 channel,然后创建了两个用户 A 和 B,并将它们添加到观察者列表中。接着我们设置了新的新闻列表,并通知所有观察者。然后我们删除了用户 B,并再次设置了新的新闻列表。
如果一切正常,用户 A 应该会收到两次通知,用户 B 只会收到一次通知。输出应该如下所示:
```
Subscriber A received the latest news: ['News1', 'News2', 'News3']
Subscriber B received the latest news: ['News1', 'News2', 'News3']
Subscriber A received the latest news: ['News4', 'News5']
```
阅读全文