作为一枚苦逼的程序猿,在平时的开发任务中往往会遇到这样的情形,同一个方法在不同的情况下要进行不同的操作,如打电话的方法,在正常情况下是打电话,但是在飞行模式下就是不能使用的,如同样是空调的调节温度的方法在没有开电源的情形下也是不能使用的吧,等等诸如此类的问题,我们当然想到了在每次操作的时候进行先决条件的判断,下面以空调为例,我们来看如下代码:
package com.demo.admin;
public class AirConditionController {
private int state = 2;
public static final int STATE_ON = 1;
public static final int STATE_OFF = 2;
public void turnOn() {
if (state == STATE_OFF) {
System.out.println("打开了空调");
state = STATE_ON;
}
}
public void turnOff() {
if (state == STATE_ON) {
System.out.println("关闭了空调");
state = STATE_OFF;
}
}
public void upTempure() {
if (state == STATE_ON) {
System.out.println("调高了温度");
}else{
System.out.println("空调关闭,无法调节温度");
}
}
public void downTempure() {
if (state == STATE_ON) {
System.out.println("降低了温度");
}else{
System.out.println("空调关闭,无法调节温度");
}
}
public void changeModel() {
if (state == STATE_ON) {
System.out.println("调节了模式");
}else{
System.out.println("空调关闭,无法调节模式");
}
}
}
在每个方法操作的时候进行状态判断,同时在开关的时候进行状态的切换就可以了。
测试代码如下:
package com.demo.admin;
public class Test {
public static void main(String[] args) {
AirConditionController controller = new AirConditionController();
controller.downTempure();
controller.turnOn();
controller.upTempure();
controller.turnOff();
controller.changeModel();
}
}
打印出的日志如下:
当然是没有任何问题的,但是大家有没有想过,如果在上述的问题中state的状态非常多,不只是开和关呢,我们又应该如何处理这个问题呢,不停地if...else,还是不停地switch...case,貌似哪种都不太合适,容易显得代码臃肿,不利于后期的维护。
是不是很苦恼呢?
苦恼的时候看看美女(开玩笑),还没想到??? 请看标题,状态模式
下面我们开始动手改代码:
先看看目录视图:
其中的AirConditionController 仍然是控制类,
IAirConditionController 抽象出的控制类接口,包含开和关两个方法
其实就是在进行状态机的状态设。
IAirConditionState抽象出的状态类,抽象出需要在不同状态下进行不同操作的方法。
OffAirConditionState 关闭状态的具体实现。
OnAirConditionState 开启状态的具体实现。
这样就好办多了,如下
IAirConditionState 抽象类需要有如下三个方法:
调高温度,降低温度,调节模式。
如下:
package model;
/**
* 状态控制接口,
* 提取需要分状态操作的方法
* @author Administrator
*
*/
public interface IAirConditionState {
public void upTempure();
public void downTempure();
public void changeModel();
}
开和关的实现分别如下:
package model;
public class OnAirConditionState implements IAirConditionState {
@Override
public void upTempure() {
System.out.println("调高了温度");
}
@Override
public void downTempure() {
System.out.println("降低了温度");
}
@Override
public void changeModel() {
System.out.println("调节了模式");
}
}
//关闭的实现状态类
package model;
public class OffAirConditionState implements IAirConditionState{
@Override
public void upTempure() {
System.out.println("空调关闭,无法调节温度");
}
@Override
public void downTempure() {
System.out.println("空调关闭,无法调节温度");
}
@Override
public void changeModel() {
System.out.println("空调关闭,无法调节模式");
}
}
IAirConditionController 抽象出开和关的方法:
如下:
package model;
/**
* 状态控制接口,
* 提取需要分状态操作的方法
* @author Administrator
*
*/
public interface IAirConditionState {
public void upTempure();
public void downTempure();
public void changeModel();
}
最终实现类如下:
package model;
public class AirConditionController implements IAirConditionController {
private IAirConditionState mIAirConditionState;
public void setmIAirConditionState(IAirConditionState mIAirConditionState) {
this.mIAirConditionState = mIAirConditionState;
}
@Override
public void turnOn() {
setmIAirConditionState(new OnAirConditionState());
}
@Override
public void turnOff() {
setmIAirConditionState(new OffAirConditionState());
}
public void upTempure() {
mIAirConditionState.upTempure();
}
public void downTempure() {
mIAirConditionState.downTempure();
}
public void changeModel() {
mIAirConditionState.changeModel();
}
}
其中关方法进行状态机状态的切换,其余的方法只需要调用状态接口的方法实现即可,具体得操作由传入的子状态类决定。
上面的问题:
如果状态很多呢? 怎么做。
只需要增加各个状态类取实现状态接口实现具体得操作就可以了。
设置状态的时候设置相应的状态就可以了。
是不是很方便呢,各位小伙伴。