红绿灯通行,红绿灯变化时,绿灯车辆 和行人通行,红灯等待:用观察者模式 实现红绿灯变换,用状态模式实现控制车辆和行人通行,用责任链模式实现整体控制。用C#语言设计。
时间: 2023-06-04 19:08:16 浏览: 66
++语言实现。
在这个场景中,观察者模式可以用于监听红绿灯的变化,当红绿灯状态发生变化时,通知所有被注册的观察者对象。例如,可以定义一个Observer类,让车辆和行人分别注册为观察者对象,当红绿灯颜色变化时,调用Observer类中的notify()函数,让所有观察者做出相应的反应。
状态模式可以用于控制车辆和行人的通行状态,例如可以定义一个State类,其中定义不同状态下的行为。例如,当红灯亮起时,车辆和行人的State状态都应该变为等待状态;当绿灯亮起时,车辆和行人的状态应该变为通行状态。通过将车辆和行人的状态与红绿灯状态进行绑定,可以实现控制车辆和行人通行的效果。
责任链模式可以用于整体控制红绿灯的状态变换和车辆、行人的通行状态。例如,可以定义一个Chain类,其中定义一系列红绿灯状态和车辆、行人状态的转换规则。当红绿灯状态变化时,Chain类就会调用相应状态转换规则,依次将红绿灯状态和车辆、行人状态进行更新。
以下是C++的代码示例:
```C++
#include <iostream>
#include <vector>
using namespace std;
class LightObserver {
public:
virtual void onColorChanged(int color) = 0;
};
class Car : public LightObserver {
public:
void onColorChanged(int color) {
if(color == 1) {
cout << "Car waiting at red light" << endl;
} else if (color == 2) {
cout << "Car passing at green light" << endl;
}
}
};
class Pedestrian : public LightObserver {
public:
void onColorChanged(int color) {
if (color == 1) {
cout << "Pedestrian waiting at red light" << endl;
} else if (color == 2) {
cout << "Pedestrian passing at green light" << endl;
}
}
};
class Light {
public:
int color;
vector<LightObserver*> observers;
void addObserver(LightObserver* observer) {
observers.push_back(observer);
}
void removeObserver(LightObserver* observer) {
// remove observer code
}
void setColor(int newColor) {
color = newColor;
notifyObservers();
}
void notifyObservers() {
for (int i = 0; i < observers.size(); i++) {
observers[i]->onColorChanged(color);
}
}
};
class State {
public:
Light* light;
virtual void handle() = 0;
};
class RedLightState : public State {
public:
void handle() {
light->setColor(1);
}
};
class GreenLightState : public State {
public:
void handle() {
light->setColor(2);
}
};
class Chain {
public:
RedLightState redLightState;
GreenLightState greenLightState;
State* currentState;
Chain(Light* light) {
redLightState.light = light;
greenLightState.light = light;
currentState = &redLightState;
}
void setState(State* newState) {
currentState = newState;
}
void handle() {
currentState->handle();
if (currentState == &greenLightState) {
setState(&redLightState);
} else {
setState(&greenLightState);
}
}
};
int main() {
Light light;
Car car;
Pedestrian pedestrian;
light.addObserver(&car);
light.addObserver(&pedestrian);
Chain chain(&light);
chain.handle(); // Run red light state
chain.handle(); // Run green light state
chain.handle(); // Run red light state
return 0;
}
```