模式概述:
让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。状态模式与有限状态机的概念紧密相关。
使用场景:
1.如果对象需要根据自身当前状态进行不同行为, 同时状态的数量非常多且与状态相关的代码会频繁变更的话, 可使用状态模式。
2. 如果某个类需要根据成员变量的当前值改变自身行为, 从而需要使用大量的条件语句时, 可使用该模式。
3. 当相似状态和基于条件的状态机转换中存在许多重复代码时, 可使用状态模式。、
代码样例:
/**
* 彩灯
*
* 背景:彩灯有两个功能按钮,一个是push,一个是pull,按下按钮会切换灯的颜色(状态)
* 状态:red,green,blue
* push:red->green->blue->red
* pull:red->blue->green->red
*/
public class Lamp {
private String color;//颜色
private Long brightness =10L;//亮度
private State state;
public Lamp() {
State state = new RedState(this);//初始redState
this.state = state;
}
public void setState(State state) {
this.state = state;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Long getBrightness() {
return brightness;
}
public void setBrightness(Long brightness) {
if(brightness <= 0L){
this.brightness = 0L;
}else if(brightness >= 100L){
this.brightness = 100L;
}else{
this.brightness = brightness;
}
}
public void push(){
state.handlePush();
System.out.println("当前颜色是:"+this.color+"========当前亮度是:"+this.brightness);
}
public void pull(){
state.handlePull();
System.out.println("当前颜色是:"+this.color+"========当前亮度是:"+this.brightness);
}
}
/**
* 状态接口
*/
public interface State {
void handlePush();
void handlePull();
}
/**
* redState
*
* push:red->green->blue->red
* pull:red->blue->green->red
*/
public class RedState implements State{
private Lamp lamp;
public RedState(Lamp lamp) {
this.lamp = lamp;
this.lamp.setColor("red");
}
@Override
public void handlePush() {
lamp.setState(new GreenState(lamp));//状态切换
lamp.setBrightness(lamp.getBrightness()+1L);//其他动作
}
@Override
public void handlePull() {
lamp.setState(new BlueState(lamp));//状态切换
lamp.setBrightness(lamp.getBrightness()-1L);//其他动作
}
}
/**
* greenState
*
* push:red->green->blue->red
* pull:red->blue->green->red
*/
public class GreenState implements State{
private Lamp lamp;
public GreenState(Lamp lamp) {
this.lamp = lamp;
this.lamp.setColor("green");
}
@Override
public void handlePush() {
lamp.setState(new BlueState(lamp));//状态切换
lamp.setBrightness(lamp.getBrightness()+1L);//其他动作
}
@Override
public void handlePull() {
lamp.setState(new RedState(lamp));//状态切换
lamp.setBrightness(lamp.getBrightness()-1L);//其他动作
}
}
/**
* blueState
*
* push:red->green->blue->red
* pull:red->blue->green->red
*/
public class BlueState implements State{
private Lamp lamp;
public BlueState(Lamp lamp) {
this.lamp = lamp;
this.lamp.setColor("blue");
}
@Override
public void handlePush() {
lamp.setState(new RedState(lamp));//状态切换
lamp.setBrightness(lamp.getBrightness()+1L);//其他动作
}
@Override
public void handlePull() {
lamp.setState(new GreenState(lamp));//状态切换
lamp.setBrightness(lamp.getBrightness()-1L);//其他动作
}
}
/**
* 测试状态
*/
public class TestState {
public static void main(String[] args) {
Lamp lamp = new Lamp();
lamp.push();
lamp.push();
lamp.pull();
lamp.pull();
lamp.pull();
lamp.pull();
lamp.push();
}
}
测试结果: