定义
状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
简单的说就是:根据状态决定行为
应用&实现
在我们以前写代码,遇到根据对象状态要做判断时通常使用的是if else
或者switch
,而有时根据业务需求这个对象的状态并不能确定有哪些或者为了可扩展性,就需要用到状态模式。
举个例子,我们有一个baby
对象,它有时会哭有时会睡觉等,并根据他的状态做出不同反应。代码实现:
- 写一个抽象对象
BabyStates
,他有一些抽象状态方法:
public abstract class BabyStates {
abstract void cry();
abstract void sleep();
}
- 写一个
Baby
对象,他继承了BabyStates
,他也有自己的状态state
:
public class Baby extends BabyStates{
BabyStates state;
@Override
void cry() {
state.cry();
}
@Override
void sleep() {
state.sleep();
}
}
3.根据Baby
的状态分别写出SleepState
对象和CryState
对象,使他们都继承BabyStates
并分别写出他们对应场景状态的动作:
public class SleepState extends BabyStates{
@Override
void cry() { }
@Override
void sleep() {
System.out.println("baby sleeping...");
}
}
public class CryState extends BabyStates{
@Override
void cry() {
System.out.println("baby crying...");
}
@Override
void sleep() { }
}
这样我们的程序只需要根据场景调用相应的状态对象即可。
小结
讲完State模式大家会觉得这个模式与 观察者模式(Observer) 或 访问者模式(Visitor) 特别相似,确实是这样,面向对象编程注重对场景的实现,站在面向对象的角度编写程序即使代码结构相似,但场景逻辑完全不同。