java设计模式之状态模式
这近在项目上用到了设计模式中的状态模式,我在这里写篇文章分享下学习经验。

状态模式给我们带来的好处和解决的一些问题:

我们让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中,将可能发生的外部情况全部考虑到,使用if else 语句来进行代码响应选择。但是这种方法对于复杂一点的状态判断,就会显得杂乱无章,容易产生错误、不利于维护;而且增加一个新的状态将会带来大量的修改。这个时候我们采用状态模式是个不错的选择。状态模式可以有效的替换在程序中的if else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来约束他们。如果我们需要新增一种状态,则只需要新增一种状态类就可以解决了,也省去了修改大量代码带来的麻烦。

下面列举一个java的列子:

一个篮球运动员的投篮手感状态,运动员的手感状态有[超常状态、正常状态、不好状态]

这时我们需要一个环境类,默认:这个运动员的状态是正常状态

public class Player {
	//正常发挥
	private State state = new NormalState();
	/**
	 * 设置投篮的状态
	 * @param state
	 */
	public void setState(State state){
		this.state = state;
	}
	public void shot(){
		// TODO Auto-generated method stub
		state.shot();
	}
}
然后我们需要给运动员的投篮手感状态定义一个接口,然后让各种投篮手感状态去实现这个接口。
public interface State {
	/**
	 * 公用的投篮结果方法
	 */
	public abstract void shot();
}
接下来我们就需要定义各种状态类了,这里我定义了3种状态,我只列举其中的一种了
/**
 * 投篮超常的状态
 * @auth  jing.yue
 * @version 1.0
 * @date  2012-07-4
 */
public class SuperState implements State {
	@Override
	public void shot() {
		System.out.println("今天你投篮十中十");
	}
}
最后一步就是投篮的测试类了,如果我们不指定状态,则默认为正常状态[投篮10中5]。我们还可以调用setState方法将运动员今天投篮的状态设置进去,然后调用shot方法来查看投篮的结果。
/**
 * 投篮状态测试类
 * @auth  jing.yue
 * @version 1.0
 * @date  2012-07-4
 */
public class TestState {

	/**
	 * 状态模式用来处理条件判断等
	 * @param args
	 */
	public static void main(String[] args) {
		Player player = new Player();
		//正常下投篮
		player.shot();
		//不正常下投篮
		player.setState(new NonormalState());
		player.shot();
		//超常下投篮
		player.setState(new SuperState());
		player.shot();
	}
}

这就是状态模式。你可以自己动手试试,动手可以加深理解的印象。

感谢您的阅读,希望对您有帮助,本文版权归 #惊讶# 所有

评论 (0)