说到公交车,大家都不陌生,坐过公交车的朋友可能都知道,一般公交车上都有售票员(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()` 方法。