设计模式--------状态模式
介绍状态模式的三大问题
-
现在的写法有什么问题?
-
什么是状态模式?
-
状态模式有什么好处?
采用一个案例来说明问题
- 现有一个手电筒,手电筒有五种模式,通过按下按钮来进行模式的切换
常见思路
- 创建一个手电筒类
- 定义五种手电筒状态,并记录当前状态
- 通过按钮方法来切换状态并调用相应的方法来执行操作
MyLight
public class MyLight {
final static int NO_LIGHT = 0;
final static int LOW_LIGHT = 1;
final static int NORMAL_LIGHT = 2;
final static int HIGH_LIGHT = 3;
final static int FLASH_LIGHT = 4;
int state = NO_LIGHT;
public void changeMode() {
if (state == NO_LIGHT) {
state = LOW_LIGHT;
System.out.println("nolight -> lowlight");
} else if (state == LOW_LIGHT) {
state = NORMAL_LIGHT;
System.out.println("lowlight -> normallight");
} else if (state == NORMAL_LIGHT) {
state = HIGH_LIGHT;
System.out.println("lowlight -> normallight");
} else if (state == HIGH_LIGHT) {
state = FLASH_LIGHT;
System.out.println("normallight -> highlight");
} else if (state == FLASH_LIGHT) {
state = NO_LIGHT;
System.out.println("highlight -> flashlight");
}
}
}
有什么问题?
- 所有的状态和动作都在此类中,不易维护
- 当加入多个动作的时候,需要对每个动作的每种状态都要做出对应的反应,此类会变得非常的长
什么是状态模式
- 允许对象在内部状态改变时改变他的行为, 让对象看起来好像修改了类
- 通过让多个状态实现同一接口,用于让状态之间可以切换,Light通过调用当前的状态类的方法实现操作,在状态类中进行状态的变更,以实现下一步的操作
重新改造代码
- 创建多个状态类
- 创建状态接口
- 改造Light类
State
public interface State {
public void press();
}
NoLightState
public class NoLightState implements State {
Light light;
public NoLightState(Light light) {
this.light = light;
}
@Override
public void press() {
State state = light.getLowLightState();
light.setState(state);
System.out.println("nolight -> lowlight");
}
}
LowLightState
public class LowLightState implements State {
Light light;
public LowLightState(Light light) {
this.light = light;
}
@Override
public void press() {
State state = light.getNormalLigState();
light.setState(state);
System.out.println("lowlight -> normallight");
}
}
NormalLightState
public class NormalLightState implements State {
Light light;
public NormalLightState(Light light) {
this.light = light;
}
@Override
public void press() {
State state = light.getHighLightState();
light.setState(state);
System.out.println("lowlight -> normallight");
}
}
HighLightState
public class HighLightState implements State {
Light light;
public HighLightState(Light light) {
this.light = light;
}
@Override
public void press() {
State state = light.getFlashLightState();
light.setState(state);
System.out.println("normallight -> highlight");
}
}
FlashLightState
public class FlashLightState implements State {
Light light;
public FlashLightState(Light light) {
this.light = light;
}
@Override
public void press() {
State state = light.getNoLightState();
light.setState(state);
System.out.println("highlight -> flashlight");
}
}
Light
public class Light {
State lowLightState;
State highLightState;
State flashLightState;
State normalLightState;
State noLightState;
State state;
public Light() {
lowLightState = new LowLightState(this);
normalLightState = new NormalLightState(this);
highLightState = new HighLightState(this);
flashLightState = new FlashLightState(this);
noLightState = new NoLightState(this);
state = noLightState;
}
public State getLowLightState() {
return lowLightState;
}
public State getHighLightState() {
return highLightState;
}
public State getFlashLightState() {
return flashLightState;
}
public State getNormalLigState() {
return normalLightState;
}
public void setState(State state) {
this.state = state;
}
public State getNoLightState() {
return noLightState;
}
public void changeMode() {
state.press();
}
}
Main
public class App {
public static void main(String[] args) throws Exception {
Light light = new Light();
light.changeMode();
light.changeMode();
}
}
// out
nolight -> lowlight
lowlight -> normallight
END
不慕招式,勤修内功