(2)生活例子:去年由于疫情影响,有一段时间海大封校,同学们周末加餐时外卖大学进不了外卖,假设大熊的朋友叮当猫如惯常一般,及时给寝室送来了一个适用于宿舍的迷你美食产生器,能照顾所有人的口味随机产出各种美食(如广味腊肠饭、湛江鸡饭、美味烤蚝、雪域冰城糖水等),但要及时取出,否则会被立刻送给其他寝室的同学。一到周末,大家都围坐在旁边,一边美美的刷着手机,一边等着一道道美食,好不惬意。但由于大家手机刷的过于投入,食物未能及时取出,经常错过符合自己口味的美食,让人沮丧不已。请大家利用观察者模式,让美食产生器出锅一道美食时,能自动通知每位同学,同学们收到通知后查看是否是自己喜欢的口味,喜欢就欢呼一声,开始自己的美食之旅。大家用自己的知识给美食产生器添加自动提醒功能后,再也没有错过可口的饭菜了……。 A)编程实现观察者模式的模式模型; 编程对上述场景进行完整实现;
时间: 2023-05-13 19:05:00 浏览: 140
A)观察者模式的模式模型:
观察者模式是一种行为设计模式,它允许对象在发生状态变化时通知其他对象。在观察者模式中,有两种类型的对象:主题和观察者。主题是状态变化的对象,观察者是接收主题状态变化通知的对象。当主题状态发生变化时,它会通知所有的观察者,让它们能够更新自己的状态。
观察者模式的模式模型包括以下几个角色:
1. 抽象主题(Subject):定义了主题的接口,包括添加、删除和通知观察者的方法。
2. 具体主题(ConcreteSubject):实现了抽象主题接口,维护了一个观察者列表,并在状态发生变化时通知观察者。
3. 抽象观察者(Observer):定义了观察者的接口,包括更新状态的方法。
4. 具体观察者(ConcreteObserver):实现了抽象观察者接口,保存了一个指向具体主题的引用,并在接收到通知时更新自己的状态。
B)场景实现:
下面是一个基于观察者模式的美食产生器场景实现的示例代码:
```python
# 抽象主题
class FoodGenerator:
def __init__(self):
self.observers = []
def add_observer(self, observer):
self.observers.append(observer)
def remove_observer(self, observer):
self.observers.remove(observer)
def notify_observers(self, food):
for observer in self.observers:
observer.update(food)
# 具体主题
class MiniFoodGenerator(FoodGenerator):
def __init__(self):
super().__init__()
def generate_food(self):
# 随机产生一道美食
food = random.choice(['广味腊肠饭', '湛江鸡饭', '美味烤蚝', '雪域冰城糖水'])
# 通知所有观察者
self.notify_observers(food)
# 抽象观察者
class Observer:
def update(self, food):
pass
# 具体观察者
class Student(Observer):
def __init__(self, name, favorite_food):
self.name = name
self.favorite_food = favorite_food
def update(self, food):
if food == self.favorite_food:
print(f'{self.name}:我喜欢的{food}出锅了!')
else:
print(f'{self.name}:我不喜欢的{food}出锅了。')
# 场景实现
if __name__ == '__main__':
# 创建迷你美食产生器
generator = MiniFoodGenerator()
# 创建学生观察者
student1 = Student('小明', '广味腊肠饭')
student2 = Student('小红', '湛江鸡饭')
student3 = Student('小刚', '美味烤蚝')
student4 = Student('小芳', '雪域冰城糖水')
# 添加观察者
generator.add_observer(student1)
generator.add_observer(student2)
generator.add_observer(student3)
generator.add_observer(student4)
# 产生美食
generator.generate_food()
```
在上面的代码中,我们定义了一个抽象主题 `FoodGenerator`,它包括添加、删除和通知观察者的方法。然后我们定义了一个具体主题 `MiniFoodGenerator`,它继承了抽象主题,并实现了随机产生美食的方法。当产生美食时,它会通知所有的观察者。
我们还定义了一个抽象观察者 `Observer`,它定义了更新状态的方法。然后我们定义了一个具体观察者 `Student`,它继承了抽象观察者,并实现了更新状态的方法。当收到通知时,它会判断是否是自己喜欢的美食,如果是就欢呼一声,否则就不理会。
在场景实现中,我们创建了一个迷你美食产生器 `generator`,并添加了四个学生观察者。然后我们调用 `generator.generate_food()` 方法产生美食,这时所有的观察者都会收到通知,并根据自己的口味判断是否喜欢这道美食。
阅读全文