说到公交车,大家都不陌生,坐过公交车的朋友可能都知道,一般公交车上都有售票员(BusConductor),当然无人售票车要除外了。售票员(BusConductor)除了收取乘客(Passenger)的车费还起着监控的作用。 试用观察者

时间: 2024-02-27 20:58:09 浏览: 21
模式设计一个公交车售票系统,其中售票员是观察者,乘客是被观察者。 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并更新。 在本题中,我们可以将售票员作为观察者,乘客作为被观察者。当有乘客上车时,售票员需要观察该乘客,并向主题对象(公交车)注册自己作为观察者。当乘客付款后,主题对象会通知所有观察者,售票员收到通知后可以进行相应的操作,例如确认乘客已经付款,或者提醒乘客需要换零钱等。 代码实现如下: ```python class Bus: def __init__(self): self.passengers = [] self.observers = [] def add_passenger(self, passenger): self.passengers.append(passenger) for observer in self.observers: observer.update(self, passenger) def register_observer(self, observer): self.observers.append(observer) def remove_observer(self, observer): self.observers.remove(observer) class Passenger: def __init__(self, name, fare): self.name = name self.fare = fare def pay_fare(self): print(self.name + " paid " + str(self.fare) + " yuan.") class BusConductor: def __init__(self): self.paid_passengers = [] def update(self, bus, passenger): if passenger not in self.paid_passengers: passenger.pay_fare() self.paid_passengers.append(passenger) # test bus = Bus() conductor = BusConductor() bus.register_observer(conductor) passenger1 = Passenger("Alice", 2) bus.add_passenger(passenger1) passenger2 = Passenger("Bob", 3) bus.add_passenger(passenger2) passenger1.pay_fare() # This will not trigger conductor's update method since passenger1 has already paid. ``` 在上面的代码中,我们创建了一个公交车对象 `bus`,一个售票员对象 `conductor` 和两个乘客对象 `passenger1` 和 `passenger2`。当 `bus.add_passenger()` 方法被调用时,该乘客会被添加到 `bus.passengers` 列表中,并向 `bus` 对象注册观察者 `conductor`。当乘客付款后,`bus` 对象会通知所有观察者,售票员收到通知后会判断该乘客是否已经付款,如果没有付款则调用 `pay_fare()` 方法进行付款操作,并将该乘客添加到 `paid_passengers` 列表中。注意,如果一个乘客已经付过款了,再次调用 `pay_fare()` 方法将不会触发售票员的 `update()` 方法。

相关推荐

最新推荐

recommend-type

基于C语言实现简单的12306火车售票系统

火车售票系统给我们的出行带来了极大的方面,那么他基于编程是如何实现的呢?今天小编抽时间给大家分享一个使用C语言写的一个简单的火车票系统,感兴趣的朋友参考下
recommend-type

计算机操作系统关于售票员和汽车司机的进程同步问题

创建两个进程模拟售票员和汽车司机的同步行为。...3. 当发车时间到,售票员关好车门后,司机才能启动车辆,售票员才开始售票。当到站时,司机停稳车后,售票员才能打开车门,车上乘客先下车,然后站牌乘客上车。
recommend-type

java多线程之火车售票系统模拟实例

下面小编就为大家带来一篇java多线程之火车售票系统模拟实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
recommend-type

操作系统课程设计:司机与售票员源代码.docx

操作系统结课的课程设计,题目为“实现司机与售票员P、V操作的同步与互斥”,此处贴上源代码,可以用codeblocks运行得到相应结果
recommend-type

火车站售票系统概要设计

1.引言 2 1.1编写目的 2 1.2项目背景 2 1.3定义 2 1.4参考资料 3 2.任务概述 3 2.1 目标 3 2.2 运行环境 3 2.3 需求概述 3 2.4条件与限制 4 3.总体设计 4 ...3.2总体结构和模块外部设计 6 ...9.维护设计 13
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。