设计模式之状态模式(State)
本篇为 https://github.com/iluwatar/java-design-patterns/tree/master/state 阅读笔记
意图
允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
使用场景:
1、行为随状态改变而改变的场景。
2、条件、分支语句的代替者。
场景
长毛象脾气多变平静–生气–平静–生气,状态可以转换,每种状态都有对应的方法
State
接口
public interface State {
void onEnterState();
void observer();
}
AngryState状态
public class AngryState implements State {
private Mammoth mammoth;
public AngryState(Mammoth mammoth) {
this.mammoth = mammoth;
}
@Override
public void onEnterState() {
System.out.println(MessageFormat.format("{0} gets angry", mammoth));
}
@Override
public void observer() {
System.out.println(MessageFormat.format("{0} is furious", mammoth));
}
}
PeacefulState
类
public class AngryState implements State {
private Mammoth mammoth;
public AngryState(Mammoth mammoth) {
this.mammoth = mammoth;
}
@Override
public void onEnterState() {
System.out.println(MessageFormat.format("{0} gets angry", mammoth));
}
@Override
public void observer() {
System.out.println(MessageFormat.format("{0} is furious", mammoth));
}
}
长毛象类
public class Mammoth {
private State state;
public Mammoth(){
state = new PeacefulState(this);
}
public void timePassBy(){
if (state.getClass().equals(PeacefulState.class)){
changeStateTo(new AngryState(this));
}else {
changeStateTo(new PeacefulState(this));
}
}
private void changeStateTo(State newState){
this.state = newState;
this.state.onEnterState();
}
@Override
public String toString() {
return "The Mammoth";
}
public void observe(){
this.state.observer();
}
}
测试
@Test
public void stateTest(){
Mammoth mammoth = new Mammoth();
mammoth.observe();
mammoth.timePassBy();
mammoth.observe();
mammoth.timePassBy();
mammoth.observe();
}
类图
在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。