【设计模式】—— 状态模式State
前言:【模式总览】——————————by xingoo
模式意图
允许一个对象在内部改变它的状态,并根据不同的状态有不同的操作行为。
例如,水在固体、液体、气体是三种状态,但是展现在我们面前的确实不同的感觉。通过改变水的状态,就可以更改它的展现方式。
应用场景
1 当一个对象的行为,取决于它的状态时
2 当类结构中存在大量的分支,并且每个分支内部的动作抽象相同,可以当做一种状态来执行时。
模式结构
Context 环境角色,里面包含状态对象
class Context{ private State state; public void setState(State state) { this.state = state; } public void operation(){ state.operation(); } }
State 状态的抽象接口
interface State{ public void operation(); }
ConcreteState 具体的状态角色
class ConcreteState1 implements State{ public void operation(){ System.out.println("state1 operation"); } } class ConcreteState2 implements State{ public void operation(){ System.out.println("state2 operation"); } } class ConcreteState3 implements State{ public void operation(){ System.out.println("state3 operation"); } }
全部代码

1 package com.xingoo.test.design.state; 2 class Context{ 3 private State state; 4 public void setState(State state) { 5 this.state = state; 6 } 7 public void operation(){ 8 state.operation(); 9 } 10 } 11 interface State{ 12 public void operation(); 13 } 14 class ConcreteState1 implements State{ 15 public void operation(){ 16 System.out.println("state1 operation"); 17 } 18 } 19 class ConcreteState2 implements State{ 20 public void operation(){ 21 System.out.println("state2 operation"); 22 } 23 } 24 class ConcreteState3 implements State{ 25 public void operation(){ 26 System.out.println("state3 operation"); 27 } 28 } 29 public class Client { 30 public static void main(String[] args) { 31 Context ctx = new Context(); 32 State state1 = new ConcreteState1(); 33 State state2 = new ConcreteState2(); 34 State state3 = new ConcreteState3(); 35 36 ctx.setState(state1); 37 ctx.operation(); 38 39 ctx.setState(state2); 40 ctx.operation(); 41 42 ctx.setState(state3); 43 ctx.operation(); 44 } 45 }
运行结果
state1 operation
state2 operation
state3 operation
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2012-11-09 堆实例
2012-11-09 大数加法
2012-11-09 Gossip费氏数列