在软件开发过程中,很多对象也会像水和信号灯一样具有多种状态,这些状态在某些情况下能够相互转换,而且对象在不同的状态下也将有不同的行为。最直接的解决方案是将所有可能考虑到,然后使用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 }
运行结果:
现在灯暗着
现在灯亮着