设计状态模式, 模拟交通灯的切换
定义状态接口
public interface State {
void switchToGreen(TrafficLight trafficLight);
void switchToYellow(TrafficLight trafficLight);
void switchToRed(TrafficLight trafficLight);
}
状态接口的具体实现
红灯状态
public class RedState implements State {
@Override
public void switchToGreen(TrafficLight trafficLight) {
System.out.println("红灯不能切换成绿灯");
}
@Override
public void switchToYellow(TrafficLight trafficLight) {
trafficLight.setState(new YellowState());
System.out.println("黄灯亮起");
}
@Override
public void switchToRed(TrafficLight trafficLight) {
System.out.println("已是红灯状态, 无需切换");
}
}
黄灯状态
public class YellowState implements State {
@Override
public void switchToGreen(TrafficLight trafficLight) {
trafficLight.setState(new GreenState());
System.out.println("绿灯亮起");
}
@Override
public void switchToYellow(TrafficLight trafficLight) {
System.out.println("已是黄灯状态, 无需切换");
}
@Override
public void switchToRed(TrafficLight trafficLight) {
trafficLight.setState(new RedState());
System.out.println("红灯亮起");
}
}
绿灯状态
public class GreenState implements State {
@Override
public void switchToGreen(TrafficLight trafficLight) {
System.out.println("绿灯状态无需切换");
}
@Override
public void switchToYellow(TrafficLight trafficLight) {
trafficLight.setState(new YellowState());
System.out.println("黄灯亮起");
}
@Override
public void switchToRed(TrafficLight trafficLight) {
System.out.println("绿灯无法切换成红灯");
}
}
定义实体类, 将状态接口注入
@Data
public class TrafficLight {
/**
* 默认为红灯
*/
private State state = new RedState();
public void setState(State state) {
this.state = state;
}
public void switchToGreen() {
state.switchToGreen(this);
}
public void switchToYellow() {
state.switchToYellow(this);
}
public void switchToRed() {
state.switchToRed(this);
}
}
测试:
@SpringBootTest
public class StateTest {
@Test
public void test1() {
TrafficLight trafficLight = new TrafficLight();
trafficLight.switchToRed();
trafficLight.switchToGreen();
trafficLight.switchToYellow();
trafficLight.switchToRed();
}
}
输出结果:
已是红灯状态, 无需切换
红灯不能切换成绿灯
黄灯亮起
红灯亮起