利用观察者模式、责任链模式和命令模式,写一个红绿灯信号通行的代码
时间: 2023-06-05 13:07:18 浏览: 91
好的,以下是一个实现红绿灯信号通行的示例代码,使用观察者模式、责任链模式和命令模式:
首先,定义一个接口 Observer,表示观察者:
```java
interface Observer {
void update();
}
```
然后,定义一个抽象类 AbstractSubject,表示主题,包含添加、删除和通知观察者等方法。
```java
abstract class AbstractSubject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : observers) {
observer.update();
}
}
}
```
接着,定义一个 TrafficLight 类,表示红绿灯。这个类继承自抽象类 AbstractSubject,实现 Runnable 接口,表示可以被线程执行。
```java
class TrafficLight extends AbstractSubject implements Runnable {
private boolean red = true;
public void run() {
while (true) {
try {
Thread.sleep(5000);
red = !red;
notifyObservers();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public boolean isRed() {
return red;
}
}
```
在红绿灯变化时,调用 notifyObservers() 方法来通知观察者。
然后,定义一个命令接口 Command,表示命令。
```java
interface Command {
void execute();
}
```
接着,定义一个 LightCommand 类,表示红绿灯命令,实现命令接口 Command。这个类的构造方法接收一个 TrafficLight 对象和一个 boolean 值,表示该命令处理红灯还是绿灯。
```java
class LightCommand implements Command {
private TrafficLight trafficLight;
private boolean red;
public LightCommand(TrafficLight trafficLight, boolean red) {
this.trafficLight = trafficLight;
this.red = red;
}
public void execute() {
if ((red && trafficLight.isRed()) || (!red && !trafficLight.isRed())) {
System.out.println("通过红绿灯");
} else {
System.out.println("红绿灯未通过");
}
}
}
```
最后,定义一个责任链类 Chain,表示责任链。这个类的构造方法接收多个命令,使用责任链模式依次执行这些命令。
```java
class Chain {
private List<Command> commands = new ArrayList<>();
public Chain(Command... commands) {
for (Command command : commands) {
this.commands.add(command);
}
}
public void execute() {
for (Command command : commands) {
command.execute();
}
}
}
```
在程序入口处,创建 TrafficLight 对象,并将两个 LightCommand 对象作为参数创建一个责任链 Chain 对象。然后启动一个线程执行 TrafficLight 对象。在主线程中,可以通过 Chain 对象依次执行红灯和绿灯命令。
```java
public class Main {
public static void main(String[] args) {
TrafficLight trafficLight = new TrafficLight();
Chain chain = new Chain(
new LightCommand(trafficLight, true),
new LightCommand(trafficLight, false)
);
new Thread(trafficLight).start();
while (true) {
chain.execute();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
这样,就可以通过观察者模式、责任链模式和命令模式实现简单的红绿灯信号通行。