惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Simon Willison's Weblog
Simon Willison's Weblog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
About on SuperTechFans
Last Week in AI
Last Week in AI
月光博客
月光博客
有赞技术团队
有赞技术团队
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
U
Unit 42
The Register - Security
The Register - Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
H
Hacker News: Front Page
Recent Announcements
Recent Announcements
C
CXSECURITY Database RSS Feed - CXSecurity.com
Latest news
Latest news
小众软件
小众软件
P
Palo Alto Networks Blog
PCI Perspectives
PCI Perspectives
Security Latest
Security Latest
S
Secure Thoughts
Scott Helme
Scott Helme
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
O
OpenAI News
S
Securelist
云风的 BLOG
云风的 BLOG
H
Help Net Security
T
Troy Hunt's Blog

博客园 - daidaidaiyu

ZooKeepper 一文入门 ThingsBoard 规则链系统源码分析和自定义定时器 嵌入式开发入门知识 一文入门和实践Kafka 一文学习入门 ThingsBoard 开源物联网平台 Claude Code 使用一则 JMS, ActiveMQ 学习一则 Nacos实例一则及其源码环境搭建 一文学习 工作流开发 BPMN、 Flowable 一文学习 Spring 声明式事务源码全流程总结 Spring IOC 源码学习 事务增强相关的对象创建 Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML) GIS 核心知识 Spring IOC 源码学习 声明式事务的入口点 23.行为型 - 访问者模式 (Visitor Pattern) 一文学习 Spring AOP 源码全过程 22.行为型 - 迭代器模式 (Iterator Pattern) Netty 核心知识 SpringCloud 微服务实现一则 (Eureka + Hystrix) 20.行为型 - 责任链模式(ChainofResponsibility Pattern) Modbus 协议 学习一则 - daidaidaiyu 19.行为型 - 策略模式(Strategy Pattern) - daidaidaiyu Redis 学习一则 - daidaidaiyu Android NDK 开发一则 - daidaidaiyu
21.行为型 - 状态模式 (State Pattern)
daidaidaiyu · 2026-02-15 · via 博客园 - daidaidaiyu

状态模式 (State Pattern)

状态模式(State)构架出一套完备的事物内部状态转换机制,并将内部状态包裹起来且对外部不可见,使其行为能随其状态的改变而改变,同时简化了事物的复杂的状态变化逻辑。

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

**in short 将一个对象(水)的状态从该对象中分离出来, 封装到专门的状态类(固态, 液态, 气态)中 (用类来表示状态) ,使得对象状态可以灵活变化(状态切换doSwitct(Water context);) **

**例如 '坦克大战'中游戏暂停机制, 可将'游戏对象' 中的所有子弹, 坦克, 位置 朝向状态抽离出来, 可以随时暂停 随时恢复, 使得(游戏)对象状态可以灵活变化; **

再例如: 当温度变化导致水的状态发生变化时,它就会有不同的行为,如冰会滚动、水会流动、水蒸气则会漂浮,体积,单位质量均不一样.

水在0℃状态呈固态 体积小; 在常温下的呈液态 体积中,以及100℃以上时 呈气态 体积最大;

UML类图

Pasted image 20231206212823

代码实例

1. 水 (Context对象)

public class Water {
    private State state;

    public State getState() {
        return state;
    }
	//设置 状态
    public void setState(State state) {
        this.state = state;
        this.state.doSwitct(this);
    }

    public void flow() {
        this.state.doFlow();
    }
    public void rolling() {
        this.state.doRolling();
    }
}

2.抽象状态定义及其特性实现 (固态, 液态,气态)

/**
 * 抽象状态定义
 **/
public interface State {
    /**
     * 状态切换
     */
    void doSwitct(Water context);
    /**
     * 流动 (状态特性方法)
     */
    void doFlow();
    /**
     * 滚动.. (状态特性方法)
     */
    void doRolling();
}
/**  
* 固态特性  
* @author yangfh  
* @date 2023-12-06 20:57  
**/  
public class SolidityState implements State{  
@Override  
public void doSwitct(Water context) {  
	System.out.println("将 "+ context+", 状态切换为固态");  
}  
  
@Override  
public void doFlow() {  
	System.out.println("当前是固态, 也不能流动...");  
}  
  
@Override  
public void doRolling() {  
	System.out.println("当前是固态, 飞砂走石");  
}  
}

/**  
* 液态特性  
* @author yangfh  
* @date 2023-12-06 20:57  
**/  
public class LiquidState implements State{  
@Override  
public void doSwitct(Water context) {  
	System.out.println("将 "+ context+", 状态切换为液态");  
}  
  
@Override  
public void doFlow() {  
	System.out.println("当前是液态, 小桥流水人家..");  
}  
  
@Override  
public void doRolling() {  
	System.out.println("当前是液态, 不能滚动");  
}  
}
  
/**  
* 气态特性  
* @author yangfh  
* @date 2023-12-06 20:57  
**/  
public class GaseousState implements State{  
@Override  
public void doSwitct(Water context) {  
	System.out.println("将 "+ context+", 状态切换为气态");  
}  
  
@Override  
public void doFlow() {  
	System.out.println("当前是气态, 不能流动");  
}  
  
@Override  
public void doRolling() {  
	System.out.println("当前是气态, 不能滚动");  
}  
}

3.测试

public static void main(String[] args) {  
  
	System.out.println("========常温环境=========");  
	// 常温环境: 液态状态  
	State state = new LiquidState();  
	//水 (Context)Water content = new Water();  
	content.setState(state);  
	content.flow();  
	content.rolling();  
	System.out.println("========低温环境=========");  
	State state2 = new SolidityState();  
	content.setState(state2);//设置状态  
	content.flow();  
	content.rolling();  
}
/**out
========常温环境=========
将 org.yang.mca.pattern21.Water@6b71769e, 状态切换为液态
当前是液态, 小桥流水人家..
当前是液态, 不能滚动
========低温环境=========
将 org.yang.mca.pattern21.Water@6b71769e, 状态切换为固态
当前是固态, 也不能流动, 只能滚动...
当前是固态, 飞砂走石
**/

状态模式总结

关键角色

  1. 上下文对象 Water
  2. 状态抽象 State
  3. 具体状态实现 SolidityState (将上下文对象, 传递过来切换其状态)

状态模式优缺点

1) 状态模式的优点:

  • 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。
  • 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

2) 状态模式的缺点:

  • 状态模式的使用必然会增加系统类和对象的个数。
  • 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。
  • 状态模式对"开闭原则"的支持并不太好 (添加新的状态类需要修改那些负责状态转换的源代码)

状态模式适用使用场景

  • 对象根据自身状态的变化来进行不同行为的操作时, 比如,购物订单状态。
  • 对象需要根据自身变量的当前值改变行为,不期望使用大量 if-else 语句时, 比如,商品库存状态。
  • 对于某些确定的状态和行为,不想使用重复代码时, 比如,某一个会员当天的购物浏览记录。