允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
类的行为是基于它的状态改变的。
public class State_Main {
public static void main(String[] args){
Person person = new Person();
Thread thr = new Thread(()->{
person.start();
});
Thread thread = new Thread(()->{
try {
State eat_state = new EatState();
person.setState(eat_state);
Thread.sleep(4000);
State drink_state = new DrinkState();
person.setState(drink_state);
Thread.sleep(4000);
State stop_state = new StopState();
person.setState(stop_state);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thr.start();
thread.start();
}
}
interface State{
void action();
String getState();
}
enum StateEnum{
EAT("eat"),
DRINK("drink"),
STOP("stop");
private String code;
StateEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
class EatState implements State{
private String state = StateEnum.EAT.getCode();
@Override
public void action() {
System.out.println("EatState...doEat...吃饭中...");
}
@Override
public String getState() {
return state;
}
}
class DrinkState implements State{
private String state = StateEnum.DRINK.getCode();
@Override
public void action() {
System.out.println("DrinkState...doDrink...喝水中...");
}
@Override
public String getState() {
return state;
}
}
class StopState implements State{
private String state = StateEnum.STOP.getCode();
@Override
public void action() {
System.out.println("停止...去休息");
}
@Override
public String getState() {
return state;
}
}
@Data
class Person {
private State state;
public Person() {
}
public void start(){
while (true){
if (state != null && StateEnum.STOP.getCode().equals(state.getState())){
state.action();
return;
}else if (state != null && !StateEnum.STOP.getCode().equals(state.getState())){
state.action();
}
}
}
public void setState(State state) {
this.state = state;
}
}