状态模式——详解红绿灯问题

状态模式——详解红绿灯问题

状态模式的定义是这样的:
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

下面做一个简答的解释,就是说当对象的状态改变了之后,再次调用对象的方法,对象会提供不同的动作。下面是一个例子:


这个是一个红绿灯问题(为了解释状态模式)。面前有一盏灯和3个按钮,灯在不同状态下按不同的灯,会给出当前转换到某种灯的状态,同时灯的颜色会发生变化。

好,下面是这个问题的解决方案:



下面是具体实现:
IState.java
package com.xueyou.demo.service;

public interface IState {
    public void buttonAPress();

    public void buttonBPress();

    public void buttonCPress();
}

StateBlack.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateBlack implements IState{
    private Singnal singnal;

    public StateBlack(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to yellow");
        
    }

    @Override
    public void buttonBPress() {
        System.out.println("turn to close");
        singnal.setState(singnal.getStateEnd());
    }

    @Override
    public void buttonCPress() {
    }
}

StateEnd.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateEnd implements IState {
    private Singnal singnal;

    public StateEnd(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {

    }

    @Override
    public void buttonBPress() {

    }

    @Override
    public void buttonCPress() {

    }
}

StateGreen.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateGreen implements IState{
    private Singnal singnal;

    public StateGreen(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to yellow");
        singnal.setState(singnal.getStateYellow());
    }

    @Override
    public void buttonBPress() {
    }

    @Override
    public void buttonCPress() {
        System.out.println("turn to red");
        singnal.setState(singnal.getStateRed());
    }
}

StateRed.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateRed implements IState{
    private Singnal singnal;

    public StateRed(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to green");
        singnal.setState(singnal.getStateGreen());
    }

    @Override
    public void buttonBPress() {
    }

    @Override
    public void buttonCPress() {
        System.out.println("turn to yellow");
        singnal.setState(singnal.getStateYellow());
    }
}

StateStart.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateStart implements IState {
    private Singnal singnal;

    public StateStart(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to black");
        singnal.setState(singnal.getStateBlack());
    }

    @Override
    public void buttonBPress() {
    }

    @Override
    public void buttonCPress() {

    }
}

StateYellow.java
package com.xueyou.demo.serviceimpl;

import com.xueyou.demo.Singnal;
import com.xueyou.demo.service.IState;

public class StateYellow implements IState {
    private Singnal singnal;

    public StateYellow(Singnal singnal) {
        this.singnal = singnal;
    }

    @Override
    public void buttonAPress() {
        System.out.println("turn to red");
        singnal.setState(singnal.getStateRed());
    }

    @Override
    public void buttonBPress() {
        System.out.println("turn to black");
        singnal.setState(singnal.getStateBlack());
    }

    @Override
    public void buttonCPress() {
        System.out.println("turn to green");
        singnal.setState(singnal.getStateGreen());
    }
}

package com.xueyou.demo;

import com.xueyou.demo.service.IState;
import com.xueyou.demo.serviceimpl.*;

import java.util.HashMap;
import java.util.Map;


public class Singnal {

    private IState stateStart;
    private IState stateEnd;
    private IState stateBlack;
    private IState stateYellow;
    private IState stateRed;
    private IState stateGreen;


    private IState state = stateStart;
    private Map<String, String> stateMap = new HashMap<>();

    public IState getStateStart() {
        return stateStart;
    }

    public IState getStateEnd() {
        return stateEnd;
    }

    public IState getStateBlack() {
        return stateBlack;
    }

    public IState getStateYellow() {
        return stateYellow;
    }

    public IState getStateRed() {
        return stateRed;
    }

    public IState getStateGreen() {
        return stateGreen;
    }

    public IState getState() {
        return state;
    }

    public void setState(IState state) {
        this.state = state;
    }

    public Singnal() {
        stateStart = new StateStart(this);
        stateEnd = new StateEnd(this);
        stateBlack = new StateBlack(this);
        stateYellow = new StateYellow(this);
        stateRed = new StateRed(this);
        stateGreen = new StateGreen(this);
        this.state = stateStart;
        stateMap.put("StateStart", "Start");
        stateMap.put("StateYellow", "Yellow");
        stateMap.put("StateBlack", "Black");
        stateMap.put("StateRed", "Red");
        stateMap.put("StateGreen", "Green");
        stateMap.put("StateEnd", "End");
    }

    public Singnal buttonAPress() {
        state.buttonAPress();
        return this;
    }

    public Singnal buttonBPress() {
        state.buttonBPress();
        return this;
    }

    public Singnal buttonCPress() {
        state.buttonCPress();
        return this;
    }

    public Singnal showState() {
        System.out.println("now state is : " + stateMap.get(this.state.getClass().getSimpleName()));
        return this;
    }
}
App.java
package com.xueyou.demo;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) {
        Singnal singnal = new Singnal();
        singnal.showState().buttonAPress().showState().buttonAPress()
                .showState().buttonAPress().showState().buttonAPress()
                .showState().buttonAPress().showState().buttonBPress()
                .showState().buttonBPress().showState();
    }
}

运行结果:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值