状态模式:把相关的行为局部化,将不同的状态行为分割开来,例如根据每小时判断一些情况(Context类),这样可以定义一个接口,并传入这个情况(传入Context类),可以把不同的条件分别实现这个接口,并分别根据这个传入的情况判断(此模式适合判断条件复杂情况)
/**
* 状态模式
* 关键
* State接口:定义接口,来封装与Context类相关的行为
* Context类(拥有一些判断属性),拥有State的引用,
* 执行判断方法时调用state接口并传入自身作为参数
* @author zbl
*
*/
public class StateCustomer {
public static void main(String[] args) {
Context context = new Context();
context.setHour(0);
context.work();
context.setHour(2);
context.work();
}
}
//状态
interface State{
public void handler(Context context);
}
//状态A
class ConcreteStateA implements State{
@Override
public void handler(Context context) {
//判断是否是状态A的条件
if(context.getHour()==1){
System.out.println("xiixi");
}else{
System.out.println("wuwu");
context.setState(new ConcreteStateB());
}
}
}
//状态B
class ConcreteStateB implements State{
@Override
public void handler(Context context) {
//判断是否是状态A的条件
if(context.getHour()==2){
System.out.println("hahah");
}else{
//context.setState(new ConcreteStateC());
}
}
}
//业务类
class Context{
private State state;
private double hour;//小时(例子)
public Context(){
state = new ConcreteStateA();//初始化时是状态A
}
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public void work(){
state.handler(this);//传入本身情况
}
}