设计模式分3大类:创建型、结构性和行为型。状态模式是行为型模式的其中一种。它适用的场景是:一个对象的行为是由它的某个状态决定的,当状态改变时,行为会随之改变。
举一个例子:一个电扇,它的转动就是一个行为。这个行为由它所处的档位决定:1档是低速转动,2档是中速转动,3档是高速转动。
我们新建一个类Fan表示电扇,这个类有一个方法rotate()表示转动这个动作。如果不使用设计模式,我们的代码可能是这样:
class Fan {
/**
*
* @param level 表示档位
*/
public void rotate(int level){
if(level==1){
System.out.println("rotate at low speed");
}
else if(level==2){
System.out.println("rotate at intermediate speed");
}
else if(level==3){
System.out.println("rotate at high speed");
}
}
}
假如电扇新增加1档,必须要修改rotate方法,这样就违反了开闭原则。这时候,我们就可以使用状态模式。状态模式的意思是:我们将对象的某个动作委托给某个具体的状态。通常,我们有一个状态的接口,这个接口下有多个具体的实现类。在上面的例子里,档位(下面的代码里用Level表示)就是一个接口,1档,2档,3档是具体的实现类。下面是使用状态模式后的代码:
interface Level{
public void rotate();
}
class Level1 implements Level {
public void rotate() {
System.out.println("rotate at low speed");
}
}
class Level2 implements Level {
public void rotate() {
System.out.println("rotate at intermediate speed");
}
}
class Level3 implements Level {
public void rotate() {
System.out.println("rotate at high speed");
}
}
class Fan {
private Level level;
public Fan(Level level){
this.level = level;
}
public Level getLevel() {
return level;
}
public void setLevel(Level level) {
this.level = level;
}
public void rotate(){
level.rotate();
}
}
public class StatePatternDemo {
public static void main(String[] args) {
Level level = new Level1();
Fan fan = new Fan(level);
fan.rotate();
fan.setLevel(new Level2());
fan.rotate();
fan.setLevel(new Level3());
fan.rotate();
}
}
输出如下:
rotate at low speed
rotate at intermediate speed
rotate at high speed
从上面的代码可以看出:我们将电扇的rotate行为委托给具体的level对象。当新增加一个档位时,我们只需要新增一个具体的Level类就可以了。这样也符合了开闭原则。




