状态模式描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为。
状态实现:
使用如下:
状态模式的关键是引入了一个抽象类来专门表示对象的状态,这个类我们叫做抽象状态类,而对象的每一种具体状态类都继承了该类,并在不同具体状态类中实现了不同状态的行为,包括各种状态之间的转换。
package com.zndroid.dm.StateModel;
/**
* Created by luzhenyu on 2017/9/15.
*/
/**抽取状态接口*/
public interface IState {
void doAction(Car car);
}
package com.zndroid.dm.StateModel;
import com.zndroid.dm.StateModel.impl.StopState;
/**
* Created by luzhenyu on 2017/9/15.
*/
public class Car {
private IState state;
public Car() {
state = new StopState();//默认车是停着的
}
public void setState(IState state) {
this.state = state;
}
public IState getState() {
return state;
}
}
状态实现:
package com.zndroid.dm.StateModel.impl;
import com.zndroid.dm.StateModel.Car;
import com.zndroid.dm.StateModel.IState;
/**
* Created by luzhenyu on 2017/9/15.
*/
public class RunState implements IState {
@Override
public void doAction(Car car) {
System.out.println("汽车正常行驶");
car.setState(this);
}
}
package com.zndroid.dm.StateModel.impl;
import com.zndroid.dm.StateModel.Car;
import com.zndroid.dm.StateModel.IState;
/**
* Created by luzhenyu on 2017/9/15.
*/
public class StopState implements IState {
@Override
public void doAction(Car car) {
System.out.println("汽车停止行驶");
car.setState(this);
}
}
package com.zndroid.dm.StateModel.impl;
import com.zndroid.dm.StateModel.Car;
import com.zndroid.dm.StateModel.IState;
/**
* Created by luzhenyu on 2017/9/15.
*/
public class WaitState implements IState {
@Override
public void doAction(Car car) {
System.out.println("汽车怠速");
car.setState(this);
}
}
使用如下:
/**
* 状态模式
* 当一个对象的状态改变时,这个对象的行为也会变,而看起来就像是这个类改变了一样
*
* 我们一般情况下会通过if else的形式处理不同状态下对象的行为,如果状态很多的情况下就会导致维护性变差,该模式可以很好的解决这种重复判断的场景
* 其核心就是:共享状态对象,将不同状态转换为对应的对象。
* 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化
* 状态模式适用于某一个对象的行为取决于该对象的状态,并且该对象的状态会在运行时转换,又或者有很多的if else判断,而这些判断只是因为状态不同而不断的切换行为。
* */
//咱们举个例子,在路上开车的时候不免遇到红绿灯,我们会根据这3中不同的状态做出相应的开车动作
Car car = new Car();
new StopState().doAction(car);
//车子上路咯~
log("----------- 进入道路 -----------");
try {
Thread.sleep(3000);
//现在是绿灯
log("---绿灯---");
new RunState().doAction(car);
Thread.sleep(3000);
//遇到红灯了
log("---红灯---");
new WaitState().doAction(car);
Thread.sleep(4000);
//现在是绿灯了
log("---绿灯---");
new RunState().doAction(car);
Thread.sleep(3000);
//到家了
log("---到家了---");
new StopState().doAction(car);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果新增状态,只需要实现状态接口即可
log("----------------我是分割线-----------------");
【欢迎上码】
【微信公众号搜索 h2o2s2】