状态模式——详解红绿灯问题
状态模式的定义是这样的:
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
下面做一个简答的解释,就是说当对象的状态改变了之后,再次调用对象的方法,对象会提供不同的动作。下面是一个例子:
这个是一个红绿灯问题(为了解释状态模式)。面前有一盏灯和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();
}
}
运行结果: