2017
01.19
01.19
设计模式分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类就可以了。这样也符合了开闭原则。