首页 > 代码库 > 状态模式

状态模式

       在软件开发过程中,很多对象也会像水和信号灯一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将有不同的行为。最直接的解决方案是将所有可能考虑到,然后使用if else 语句来进行不同情况的处理,但是这种硬编码方法在对待复杂状态的判断就显得力不从心了,增加新的状态或修改一个状态都有可能会导致原有的程序大幅度·的修改。

        我们可以将不同的状态设为对应的状态对象,再将状态抽象化调用,便不必考虑复杂的状态逻辑。

        现在我们来用状态模式描述灯的亮与暗即状态转换。

抽象状态接口类:

1 public interface LightState {
2 public void PressSwitch(Light light);//每种状态可以向其他状态转换   需要将灯的实体传入状态 类  以便于状态类对灯进行更多的动作
3 }

 

具体状态类:

1 public class LightOff implements LightState {
2 
3     @Override
4     public void PressSwitch(Light light) {
5      System.out.println("现在灯暗着");
6      light.setState(new LightOn());
7     }
8 
9 }
1 public class LightOn implements LightState {
2 
3     @Override
4     public void PressSwitch(Light light) {
5       System.out.println("现在灯亮着");
6       light.setState(new LightOff());
7     }
8 
9 }

 

山下文角色:

 1 public class Light {
 2 private LightState state;//灯存在属性为它的状态
 3 
 4 public Light(LightState state) {
 5     super();
 6     this.state = state;
 7 }
 8 
 9 public LightState getState() {
10     return state;
11 }
12 
13 public void setState(LightState state) {
14     this.state = state;
15 }
16 /*
17  *     light   自身并无太多功能     不同状态的行为依托于具体的状态 将自身需要传入并调用具体状态的方法操作自身
18  */
19 public void pressSwhitch(){
20     state.PressSwitch(this);
21 }
22 }

 

客户测试类:

 1 public class StatePattern {
 2 
 3     public static void main(String[] args) {
 4     Light light = new Light(new LightOff());//创建实体灯并附初始状态暗着
 5     
 6     light.pressSwhitch();
 7     light.pressSwhitch();
 8 
 9     }
10 
11 }

运行结果:

现在灯暗着
现在灯亮着

 

状态模式