设计模式的应用-状态模式

设计状态模式, 模拟交通灯的切换

定义状态接口

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();
    }
}

输出结果:

已是红灯状态, 无需切换
红灯不能切换成绿灯
黄灯亮起
红灯亮起

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值