State:状态模式
先代码
父类或接口类:
package h.l.demo.state;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月29日
* @Description: 抽象状态类
*/
public abstract class State {
// 处理行为
public abstract void handle(Context context);
}
子类或实现类(两个):
package h.l.demo.state;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月29日
* @Description: 具体实现类 具体状态
*/
public class ConcreteStateA extends State {
@Override
public void handle(Context context) {
context.setState(new ConcreteStateB());
}
}
package h.l.demo.state;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月29日
* @Description: 具体实现类 具体状态
*/
public class ConcreteStateB extends State {
@Override
public void handle(Context context) {
context.setState(new ConcreteStateA());
}
}
Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态:
package h.l.demo.state;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月29日
* @Description: 维护一个ConcreteState子类的实例,这个实例定义当前的状态
*/
public class Context {
private State state;
public void setState(State state) {
this.state = state;
System.out.println("当前state来自:" + state.getClass().getName());
}
public void request(){
state.handle(this);
}
}
测试类:
package h.l.demo.state;
/**
*
* @author: Is-Me-Hl
* @date: 2020年1月31日
* @Description: 测试
*/
public class TestMainEnter {
public static void main(String[] args) {
Context context =new Context();
context.setState(new ConcreteStateA());
context.request();
context.request();
context.request();
context.request();
context.request();
context.request();
context.request();
}
}
测试结果:
后分析
- 个人建议:写代码是件幸福的事,So,do it
状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。简单说,就是如上述例子所示,Context类中的state属性一旦通过setState()方法被重新设置了,Context实例再调用request()方法时,其实际的行为就被改变了,request()方法中执行的语句不再是原先State对象中handler方法了。总结:状态模式指的是状态变了,行为就变了。
状态模式主要解决的是当前控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同的一列类当中,可以把复杂的判断逻辑简化。
什么时候用状态模式呢?当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。另外如果业务需求某项业务有多个状态,状态变化依靠大量的多分支判断语句实现,这时就应该考虑到将每一种业务状态定义为一个State的子类,这样这些对象就可以不依赖于其他对象而独立变化了。某一天客户需要改变需求,增加或者减少业务状态或改变状态模式都可以使用该模式了。
现实中:状态模式在每一位小伙伴身上可以使用,如:大家每天都会遇到何种各样的问题,不同的问题带给我们的感受不一样。这也是状态模式的一个体现。在代码中,如存在多个if else判断,逻辑判断过于复杂,我们就可以将这种行为抽象出来使用状态模,将逻辑写在不同的类中。
其他例子:参考自《大话设计模式》无尽加班何时休案例
注:以上文章仅是个人总结,若有不当之处,望不吝赐教