用java观察者模式设计一个公交车售票系统,其中售票员是观察者,乘客是被观察者。 观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并更新。 在本题中,我们可以将售票员作为观察者,乘客作为被观察者。当有乘客上车时,售票员需要观察该乘客,并向主题对象(公交车)注册自己作为观察者。当乘客付款后,主题对象会通知所有观察者,售票员收到通知后可以进行相应的操作,例如确认乘客已经付款,或者提醒乘客需要换零钱等。
时间: 2024-02-27 09:58:16 浏览: 142
Java 观察者模式
好的,以下是用 Java 实现观察者模式的公交车售票系统:
```java
import java.util.ArrayList;
import java.util.List;
// 主题对象(公交车)
class Bus {
private List<Passenger> passengers;
private List<BusConductor> observers;
public Bus() {
this.passengers = new ArrayList<>();
this.observers = new ArrayList<>();
}
public void addPassenger(Passenger passenger) {
this.passengers.add(passenger);
for (BusConductor observer : this.observers) {
observer.update(this, passenger);
}
}
public void registerObserver(BusConductor observer) {
this.observers.add(observer);
}
public void removeObserver(BusConductor observer) {
this.observers.remove(observer);
}
}
// 被观察者(乘客)
class Passenger {
private String name;
private int fare;
public Passenger(String name, int fare) {
this.name = name;
this.fare = fare;
}
public void payFare() {
System.out.println(this.name + " paid " + this.fare + " yuan.");
}
}
// 观察者(售票员)
class BusConductor {
private List<Passenger> paidPassengers;
public BusConductor() {
this.paidPassengers = new ArrayList<>();
}
public void update(Bus bus, Passenger passenger) {
if (!this.paidPassengers.contains(passenger)) {
passenger.payFare();
this.paidPassengers.add(passenger);
}
}
}
// 测试
public class BusTicketSystem {
public static void main(String[] args) {
Bus bus = new Bus();
BusConductor conductor = new BusConductor();
bus.registerObserver(conductor);
Passenger passenger1 = new Passenger("Alice", 2);
bus.addPassenger(passenger1);
Passenger passenger2 = new Passenger("Bob", 3);
bus.addPassenger(passenger2);
passenger1.payFare(); // This will not trigger conductor's update method since passenger1 has already paid.
}
}
```
在上面的代码中,我们创建了一个公交车对象 `bus`,一个售票员对象 `conductor` 和两个乘客对象 `passenger1` 和 `passenger2`。当 `bus.addPassenger()` 方法被调用时,该乘客会被添加到 `bus.passengers` 列表中,并向 `bus` 对象注册观察者 `conductor`。当乘客付款后,`bus` 对象会通知所有观察者,售票员收到通知后会判断该乘客是否已经付款,如果没有付款则调用 `payFare()` 方法进行付款操作,并将该乘客添加到 `paidPassengers` 列表中。注意,如果一个乘客已经付过款了,再次调用 `payFare()` 方法将不会触发售票员的 `update()` 方法。
阅读全文