观察者模式深入解析:以Weather-O-Rama气象站为例

需积分: 9 1 下载量 194 浏览量 更新于2024-07-27 收藏 2.29MB PDF 举报
"Head.First设计模式的第三部分,聚焦于观察者(Observer)模式,讨论如何使对象在运行时能够得知并应对感兴趣的状态变化。这一模式在Java中广泛应用,有助于实现松耦合的一对多关系。文档以一个Weather-O-Rama气象站的案例介绍了观察者模式的实际应用场景,包括WeatherData对象的创建,以及开发一个允许第三方扩展的气象观测站应用的API设计要求。" 观察者模式是软件设计中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式通过java.util.Observable和java.util.Observer接口实现。在Head.First设计模式的这部分内容中,它被用于解决Weather-O-Rama气象站的需求,该气象站需要在接收到新的气象测量数据时,实时更新各种布告板的显示。 案例中,气象站包含物理设备如温度、湿度和气压感应装置,这些设备收集数据并传递给WeatherData对象。WeatherData对象作为被观察者,存储和管理当前的天气状况。而布告板则扮演观察者的角色,它们订阅WeatherData对象,当WeatherData对象的状态(如天气数据)发生变化时,布告板会接收到通知并更新显示内容。 这种设计允许系统保持松耦合,因为WeatherData对象并不需要知道哪些布告板需要更新,它只需要在状态改变时通知所有注册的观察者。同样,新的布告板或应用可以轻松地添加到系统中,只需实现Observer接口并与WeatherData对象进行交互即可。Weather-O-Rama气象站的API设计要求表明,他们期望提供一种方式让外部开发者能够创建自定义的气象显示,进一步强调了观察者模式的可扩展性和灵活性。 观察者模式的关键概念包括: 1. **被观察者(Observable)**:拥有状态的对象,当状态变化时会通知观察者。 2. **观察者(Observer)**:对被观察者状态变化感兴趣的实体,收到通知后执行相应操作。 3. **注册(Register)**:观察者向被观察者注册,表达对状态变化的兴趣。 4. **通知(Notify)**:被观察者状态改变时,通知所有已注册的观察者。 5. **解除注册(Deregister)**:观察者可以取消对被观察者的关注,不再接收通知。 通过观察者模式,开发人员可以创建灵活、响应快速且易于维护的系统,特别是在需要实时同步多个组件的状态或者支持动态扩展的情况下。在Java中,实现观察者模式不仅可以使用内置的Observable和Observer接口,也可以通过事件驱动的方式,如Swing和JavaFX中的事件处理机制。

对下面代码每一步含义进行注释 def convert_to_doubly_linked_list(self): if not self.root: return None def convert(root): if not root.left and not root.right: return ListNode(root.val) if not root.left: right_head = convert(root.right) right_tail = right_head while right_tail.next: right_tail = right_tail.next cur_node = ListNode(root.val, None, right_head) right_head.prev = cur_node return cur_node if not root.right: left_tail = convert(root.left) left_head = left_tail while left_head.prev: left_head = left_head.prev cur_node = ListNode(root.val, left_tail, None) left_tail.next = cur_node return cur_node left_tail = convert(root.left) right_head = convert(root.right) left_head = left_tail while left_head.prev: left_head = left_head.prev right_tail = right_head while right_tail.next: right_tail = right_tail.next cur_node = ListNode(root.val, left_tail, right_head) left_tail.next = cur_node right_head.prev = cur_node return left_head return convert(self.root) def inorder_traversal(self, root): if not root: return self.inorder_traversal(root.left) print(root.val, end=' ') self.inorder_traversal(root.right) def print_bst(self): self.inorder_traversal(self.root) print() def traverse_doubly_linked_list(self, head): cur_node = head while cur_node: print(cur_node.val, end=' ') cur_node = cur_node.next print() def reverse_traverse_doubly_linked_list(self, head): cur_node = head while cur_node.next: cur_node = cur_node.next while cur_node: print(cur_node.val, end=' ') cur_node = cur_node.prev print()

2023-06-12 上传