定义
状态(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) 特别相似,确实是这样,面向对象编程注重对场景的实现,站在面向对象的角度编写程序即使代码结构相似,但场景逻辑完全不同。
状态模式是一种设计模式,它将复杂的状态判断逻辑转移到不同的状态对象中,使得对象在内在状态改变时能够改变其行为。例如,在一个婴儿对象(Baby)的例子中,根据婴儿的状态(如SleepState或CryState),对象会执行不同的动作。这种方式提高了代码的可扩展性和可读性,避免了大量if-else或switch语句。通过创建不同的状态类并让它们实现相同接口,我们可以轻松地添加更多状态,而不会影响原有代码结构。
1453





