山西太原建站哪家弿,福州公司网站建设一定要用主流程序php语言,wordpress图片调方法,链接转二维码生成器一、什么是状态模式 状态#xff08;State#xff09;模式的定义#xff1a;对有状态的对象#xff0c;把复杂的“判断逻辑”提取到不同的状态对象中#xff0c;允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色#xff1a;
环境类#xff08…一、什么是状态模式 状态State模式的定义对有状态的对象把复杂的“判断逻辑”提取到不同的状态对象中允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色
环境类Context角色也称为上下文它定义了客户端需要的接口内部维护一个当前状态并负责具体状态的切换。抽象状态State角色定义一个接口用以封装环境对象中的特定状态所对应的行为可以有一个或多个行为。具体状态Concrete State角色实现抽象状态所对应的行为并且在需要的情况下进行状态切换。
二、状态模式的实现
1. 抽象状态State
/*** author FluffyCatkin* version 1.0* date 2020/1/7 0007 15:01* description 抽象状态State角色定义一个接口用以封装环境对象中的特定状态所对应的行为。*/
public abstract class State {public abstract void behavior(Context context);
}
2. 环境Context /*** author FluffyCatkin* version 1.0* date 2020/1/7 0007 15:01* description 环境Context角色也称为上下文它定义了客户感兴趣的接口维护一个当前状态并将与状态相关的操作委托给当前状态对象来处理。*/
public class Context {private State state;public Context(){this.state new ConcreteStateA();}public State getState() {return state;}public void setState(State state) {this.state state;}public void handle(){state.behavior(this);}
}
3. 具体状态Concrete State
具体状态A
/*** author FluffyCatkin* version 1.0* date 2020/1/7 0007 15:01* description 具体状态Concrete State角色实现抽象状态所对应的行为。*/
public class ConcreteStateA extends State {Overridepublic void behavior(Context context) {System.out.println(ConcreteStateA..................);context.setState(new ConcreteStateB());}
}
具体状态B
/*** author FluffyCatkin* version 1.0* date 2020/1/7 0007 15:01* description 具体状态Concrete State角色实现抽象状态所对应的行为。*/
public class ConcreteStateB extends State {Overridepublic void behavior(Context context) {System.out.println(ConcreteStateB............);context.setState(new ConcreteStateA());}
}
4. 测试类 /*** author FluffyCatkin* version 1.0* date 2020/1/7 0007 15:00* description 狀態模式** 在软件开发过程中应用程序中的有些对象可能会根据不同的情况做出不同的行为我们把这种对象称为有状态的对象而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时其内部状态会发生改变从而使得其行为也随之发生改变。如人的情绪有高兴的时候和伤心的时候不同的情绪有不同的行为当然外界也会影响其情绪变化。** 对这种有状态的对象编程传统的解决方案是将这些所有可能发生的情况全都考虑到然后使用 if-else 语句来做状态判断再进行不同情况的处理。但当对象的状态很多时程序会变得很复杂。而且增加新的状态要添加新的 if-else 语句这违背了“开闭原则”不利于程序的扩展。** 以上问题如果采用“状态模式”就能很好地得到解决。状态模式的解决思想是当控制一个对象状态转换的条件表达式过于复杂时把相关“判断逻辑”提取出来放到一系列的状态类当中这样可以把原来复杂的逻辑判断简单化。* 状态模式的定义与特点* 状态State模式的定义对有状态的对象把复杂的“判断逻辑”提取到不同的状态对象中允许状态对象在其内部状态发生改变时改变其行为。** 状态模式是一种对象行为型模式其主要优点如下* 状态模式将与特定状态相关的行为局部化到一个状态中并且将不同状态的行为分割开来满足“单一职责原则”。* 减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确且减少对象间的相互依赖。* 有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。** 状态模式的主要缺点如下:* 状态模式的使用必然会增加系统的类与对象的个数。* 状态模式的结构与实现都较为复杂如果使用不当会导致程序结构和代码的混乱。* 状态模式的结构与实现* 状态模式把受环境改变的对象行为包装在不同的状态对象里其意图是让一个对象在其内部状态改变的时候其行为也随之改变。现在我们来分析其基本结构和实现方法。* 模式的结构:* 状态模式包含以下主要角色。环境Context角色也称为上下文它定义了客户感兴趣的接口维护一个当前状态并将与状态相关的操作委托给当前状态对象来处理。* 抽象状态State角色定义一个接口用以封装环境对象中的特定状态所对应的行为。* 具体状态Concrete State角色实现抽象状态所对应的行为。* 状态模式的应用场景:* 通常在以下情况下可以考虑使用状态模式。当一个对象的行为取决于它的状态并且它必须在运行时根据状态改变它的行为时就可以考虑使用状态模式。* 一个操作中含有庞大的分支结构并且这些分支决定于对象的状态时。*/
public class Main {Testpublic void stateMode(){Context context new Context();context.handle();context.handle();context.handle();context.handle();}}
运行结果
ConcreteStateA..................
ConcreteStateB............
ConcreteStateA..................
ConcreteStateB............Process finished with exit code 0c三、应用场景 通常在以下情况下可以考虑使用状态模式:
当一个对象的行为取决于它的状态并且它必须在运行时根据状态改变它的行为时就可以考虑使用状态模式。一个操作中含有庞大的分支结构并且这些分支决定于对象的状态时。
四、优缺点分析 状态模式是一种对象行为型模式其主要优点如下
结构清晰状态模式将与特定状态相关的行为局部化到一个状态中并且将不同状态的行为分割开来满足“单一职责原则”。将状态转换显示化减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确且减少对象间的相互依赖。状态类职责明确有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。 状态模式的主要缺点如下
状态模式的使用必然会增加系统的类与对象的个数。状态模式的结构与实现都较为复杂如果使用不当会导致程序结构和代码的混乱。状态模式对开闭原则的支持并不太好对于可以切换状态的状态模式增加新的状态类需要修改那些负责状态转换的源码否则无法切换到新增状态而且修改某个状态类的行为也需要修改对应类的源码。
代码地址https://gitee.com/fluffycatkin/JavaDesignModel.git 原文出处http://c.biancheng.net/view/1388.html