意图
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类。
动机
在软件开发过程中,应用程序中的有些对象可能会根据不同的情况做出不同的行为,我们把这种对象称为有状态的对象,而把影响对象行为的一个或多个动态变化的属性称为状态。当有状态的对象与外部事件产生互动时,其内部状态会发生改变,从而使得其行为也随之发生改变。
适用性
通常在以下情况下可以考虑使用状态模式:
- 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
- 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。
结构
状态模式模式的主要角色有:
- 抽象状态类(
Status
)、具体状态类(ConcreteStatus
)、环境类(Context
)
实现
// 抽象状态类
public interface Status {
void handle();
}
//具体状态类A
public class ConcreteStratusA implements Status {
@Override
public void handle() {
System.out.println("执行 ConcreteStratusA 的处理状态方法。。。");
}
}
public class ConcreteStratusB implements Status {
@Override
public void handle() {
System.out.println("执行 ConcreteStratusB 的处理状态方法。。。");
}
}
// 环境类
public class Context {
private Status status;
public void setStatus(Status status) {
this.status = status;
}
// 通过 set 不同的 status 对象,而动态地改变他的行为
public void operation() {
status.handle();
}
}
// 测试客户端
public class TestClient {
public static void main(String[] args) {
Context context = new Context();
Status concreteA = new ConcreteStratusA();
Status concreteB = new ConcreteStratusB();
context.setStatus(concreteA);
context.operation();
context.setStatus(concreteB);
context.operation();
}
}
已知应用
相关模式
状态模式与策略模式:
1、状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。
2、两者的意图不同: 状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。
3、状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。
状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变。
参考资料
- 《
Head First
设计模式》 - 图说设计模式
- Java设计模式:23种设计模式全面解析(超级详细)