什么是状态模式?
就是行为随着状态的改变而改变 ,比如: 我今天心情好,我去跑步,今天心情不好我在家睡觉
何时使用: 代码中包含大量与对象状态有关的条件语句。
应用实例: 1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。
优点: 1 、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。2 、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。3 、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。
使用场景: 1、行为随状态改变而改变的场景。 2、条件、分支语句的代替者。
我们之前是怎么控制状态的,使用枚举或者 if() , switch()
public void state(int state){
switch (state){
case 1:
System.out.println("我是开启状态");
break;
case 2:
System.out.println("我是关闭状态");
break;
}
}
@Test
public void testState(){
state(1);
}
如果状态代码 量特别大的话 就不推荐使用了 因为一个方法中不建议写太多的代码 而且扩展性也不行 这样的效率也不是最好的
这时候我们可以将这些状态封装在各自的类中 通过改变状态从而改变行为
状态接口
public interface State {
public void doAction(Context context);
}
状态类
//启动状态
public class StartState implements State {
public void doAction(Context context) {
//改变 context 里的 state状态 为StartState
context.setState(this);
}
public String toString(){
return "启动 State";
}
}
状态类
//停止状态
public class StopState implements State {
public void doAction(Context context) {
//改变 context 里的 state状态 为StopState
context.setState(this);
}
public String toString(){
return "停止 State";
}
}
行为类
public class Context {
private State state;
public Context (){
state = null;
}
public void setState(State state){
this.state = state;
}
public State getState(){
return state;
}
}
测试
public class StatePatternDemo {
public static void main(String[] args) {
Context context = new Context(); //行为
StartState startState = new StartState();//启动状态
//改变行为的状态
startState.doAction(context);
//此刻行为的状态就是 启动状态
System.out.println(context.getState().toString());
StopState stopState = new StopState();//停止状态
//改变行为的状态
stopState.doAction(context);
//此刻行为的状态就是 停止状态
System.out.println(context.getState().toString());
}
}
启动 State
停止 State
点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/120239156
内容来源于网络,如有侵权,请联系作者删除!