观察者模式实现交通信号灯
时间: 2023-06-29 12:11:22 浏览: 64
观察者模式是一种设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会接收到通知并进行相应的处理。
在交通信号灯的实现中,我们可以定义一个主题对象,即交通信号灯,它有三种状态:红灯、绿灯和黄灯。同时,我们还需要定义一个观察者接口,即交通参与者,它有两个方法:等待和通行。
下面是一个示例代码:
```java
// 定义主题对象
public class TrafficSignal {
private String state;
public void setState(String state) {
this.state = state;
notifyObservers();
}
public String getState() {
return state;
}
// 定义观察者接口
public interface TrafficParticipant {
void waitToCross();
void cross();
}
// 定义观察者列表
private List<TrafficParticipant> observers = new ArrayList<>();
// 添加观察者
public void attach(TrafficParticipant observer) {
observers.add(observer);
}
// 删除观察者
public void detach(TrafficParticipant observer) {
observers.remove(observer);
}
// 通知所有观察者
public void notifyObservers() {
for (TrafficParticipant observer : observers) {
if ("red".equals(state)) {
observer.waitToCross();
} else if ("green".equals(state)) {
observer.cross();
}
}
}
}
// 定义交通参与者
public class TrafficParticipantImpl implements TrafficSignal.TrafficParticipant {
private String name;
public TrafficParticipantImpl(String name) {
this.name = name;
}
@Override
public void waitToCross() {
System.out.println(name + " is waiting to cross the road.");
}
@Override
public void cross() {
System.out.println(name + " is crossing the road.");
}
}
// 测试代码
public class Test {
public static void main(String[] args) {
TrafficSignal trafficSignal = new TrafficSignal();
TrafficParticipantImpl car1 = new TrafficParticipantImpl("Car1");
TrafficParticipantImpl car2 = new TrafficParticipantImpl("Car2");
TrafficParticipantImpl pedestrian1 = new TrafficParticipantImpl("Pedestrian1");
TrafficParticipantImpl pedestrian2 = new TrafficParticipantImpl("Pedestrian2");
// 添加观察者
trafficSignal.attach(car1);
trafficSignal.attach(car2);
trafficSignal.attach(pedestrian1);
trafficSignal.attach(pedestrian2);
// 红灯
trafficSignal.setState("red");
// 绿灯
trafficSignal.setState("green");
// 黄灯
trafficSignal.setState("yellow");
// 删除观察者
trafficSignal.detach(car1);
trafficSignal.detach(car2);
trafficSignal.detach(pedestrian1);
trafficSignal.detach(pedestrian2);
}
}
```
在上面的示例代码中,我们定义了一个TrafficSignal类作为主题对象,它有一个状态变量state,表示交通信号灯的状态。当调用setState方法更新状态时,会调用notifyObservers方法通知所有观察者。
同时,我们定义了一个TrafficSignal.TrafficParticipant接口作为观察者接口,它有两个方法waitToCross和cross,分别表示等待和通行。我们还定义了一个TrafficParticipantImpl类作为具体的观察者实现。在测试代码中,我们创建了四个观察者,并将它们添加到TrafficSignal对象中进行管理。当调用setState方法更新状态时,所有观察者都会接收到状态变化的通知,并进行相应的处理。
总的来说,观察者模式可以很好地解决交通信号灯这种一对多的场景。它使得主题对象和观察者对象之间的耦合度降低,同时也方便了代码的扩展和维护。