定义
状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for Status)。简而言之——对象可根据不同情况作出不同行为。
阿里规范手册有言:
超过三层的if-else的逻辑判断代码可以使用卫语句(指在分支判断中提前返回)、策略模式、状态模式来实现,其中卫语句示例如下:
public void today() {
if (isBusy()) {
System.out.println("change time.");
return;
}
if (isFree()) {
System.out.println("go to travel.");
return;
}
}
代码对比演示
条件判断对象属性
if("Happy".equals(zhangSan.getState())){
System.out.println("跑着去学校");
}
if("Sad".equals(zhangSan.getState())){
System.out.println("走着去学校");
}
if("Sick".equals(zhangSan.getState())){
System.out.println("病了不去学校");
}
状态模式改造
public class StatePattern {
public static void main(String[] args) {
Student zhangSan = new Student();
zhangSan.changeState(new Happy());
zhangSan.howToGo(); // 跑着去学校
zhangSan.changeState(new Sad());
zhangSan.howToGo(); // 走着去学校
}
}
// 状态接口
interface State{
void goSchool();
}
class Happy implements State{
@Override
public void goSchool() {
System.out.println("跑着去学校");
}
}
class Sad implements State{
@Override
public void goSchool() {
System.out.println("走着去学校");
}
}
class Sick implements State{
@Override
public void goSchool() {
System.out.println("病了不去学校");
}
}
class Student{
private State state;
public void changeState(State state){
this.state = state;
}
public void howToGo(){
state.goSchool();
}
}
改用枚举
public class StatePattern {
public static void main(String[] args) {
Student.Happy.howToGo();
Student.Sad.howToGo();
}
}
interface State{
void goSchool();
}
class Happy implements State{
@Override
public void goSchool() {
System.out.println("跑着去学校");
}
}
class Sad implements State{
@Override
public void goSchool() {
System.out.println("走着去学校");
}
}
class Sick implements State{
@Override
public void goSchool() {
System.out.println("病了不去学校");
}
}
enum Student{
Happy(new Happy()),
Sad(new Sad()),
Sick(new Sick());
private State state;
Student(State state) {
this.state = state;
}
public void howToGo(){
state.goSchool();
}
}