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


Hit Counter by http://yizhantech.com/