如有转载,请申明:
转载至 http://blog.csdn.net/qq_35064774/article/details/52122111
1 什么是状态模式
状态模式允许一个对象在其内部状态改变时改变其行为。从外界看起来就像类改变了一样。
通俗说来,就是内部状态不同,行为不同。
比如,作为人来说,高兴状态和难过状态,做同一件事的效果可能不一样。
2 如何实现状态模式
首先还是以一个问题作为入口。
* 现有一个机器人,他有三种状态:高兴、平静、难过
* 他有say和work方法
* 高兴的时候会说“Hello,nice to meet you.”,工作效率是1.5
* 平静的时候会说“Hello, my name is robot.”,工作效率是1
* 难过的时候会说“I don't want to talk with you.”,工作效率是0.5
如果没有学习过状态模式的同学很可能会直接定义一个机器人类和一个枚举类型的状态,然后在say和work方法中通过switch或if,根据不同状态执行不同代码。这样确实简单直接,但如果状态多,与状态相关的方法也多的时候,容易造成类的代码过于庞大,不容易维护。
这时候我们需要寻找一种扩展性良好的方法。
首先我们需要抽象出一个状态的类或接口。这个类或接口中需要含有与状态有关的所有方法。这样我们在机器人类中就没必要自己实现,而是交给状态子类来实现。
package com.ittianyu.state;
public interface State {
void say();
void work();
}
然后我们定义具体的状态。
package com.ittianyu.state;
public class HappyState implements State {
@Override
public void say() {
System.out.println("Hello,nice to meet you.");
}
@Override
public void work() {
System.out.println("当前工作效率1.5");
}
}
package com.ittianyu.state;
public class CalmState implements State {
@Override
public void say() {
System.out.println("Hello, my name is robot.");
}
@Override
public void work() {
System.out.println("当前工作效率1");
}
}
package com.ittianyu.state;
public class SadState implements State {
@Override
public void say() {
System.out.println("I don't want to talk to you.");
}
@Override
public void work() {
System.out.println("当前工作效率0.5");
}
}
有了状态之后,就应该定义机器人类了
package com.ittianyu.state;
public class Robot implements State{
private State state;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
@Override
public void say() {
state.say();
}
@Override
public void work() {
state.work();
}
}
这里让机器人类实现State接口,是为了从语法上强制让机器人类拥有状态中的方法。
最后是测试类
package com.ittianyu.state;
public class Test {
public static void main(String[] args) {
Robot robot = new Robot();
robot.setState(new HappyState());
robot.say();
robot.work();
robot.setState(new CalmState());
robot.say();
robot.work();
robot.setState(new SadState());
robot.say();
robot.work();
}
}
3 在什么情况下使用状态模式
* 一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。
* 对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立存在和演化。
4 状态模式的优点和缺点
优点:
* 封装了转换规则。
* 可以方便的增加新的状态。
缺点:
* 会增加系统类和对象类的个数。