设计模式(18):状态模式

核心

  • 用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题

结构

  • 环境类(Context):
    • 环境类中维护一个State对象,它定义了当前的状态,并委托当前状态处理一些请求;
  • 抽象状态类(State):
    • 用于封装对象的一个特定状态所对应的行为;
  • 具体状态类(ConcreteState):
    • 实现了抽象状态类,每个具体状态封装了各自状态对应的行为;

场景

  • 电梯的运行
    • 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态
  • 红绿灯
    • 红灯、黄灯、绿灯
  • 请假审批
  • 企业或政府系统
    • 公文的审批
  • 网购订单状态
    • 下单
    • 已付款
    • 已发货
    • 发货中
    • 已收货

开发中常见的场景

  • 银行系统中账号状态的管理
  • OA系统中公文状态的管理
  • 酒店系统中,房间状态的管理
  • 线程对象各状态之间的切换

举例代码实现

  • 场景:酒店系统中房间的状态变化:

    • 已预定: 已预订状态可以入住,入住后就变成已入住状态;也可以取消预订,取消预订后就变成空闲状态;
    • 已入住: 已入住状态可以退房,退房后变成空闲状态;
    • 空闲: 空闲状态可以预订,预订后变成预订状态;也可以入住,入住后变成已入住状态;
  • 代码实现

  • 抽象状态类(State)

java 复制代码
/**
 * 抽象房间状态 接口
 */
public interface State {
	void handle();
}
  • 具体状态类(ConcreteState)
java 复制代码
/**
 * 空闲状态
 */
public class FreeState implements State{
	@Override
	public void handle() {
		System.out.println("房间空闲中,可预订。。。。。");
	}	
}
/**
 * 已预定状态
 */
public class BookedState implements State{
	@Override
	public void handle() {
		System.out.println("房间已预订。。。。。");
	}	
}
/**
 * 已入住状态
 */
public class CheckedInState implements State{
	@Override
	public void handle() {
		System.out.println("房间已入住,请勿打扰。。。。。");
	}	
}
  • 环境类(Context)
java 复制代码
/**
 * 环境类:
 * 房间对象,持有状态的引用
 */
public class HomeContext {
	private State state;
	/**
	 * 设置状态。。
	 * @param state
	 */
	public void setState(State state){
		System.out.println("修改状态。。");
		this.state=state;
		this.state.handle();		
	}
}
  • 客户端调用
java 复制代码
public static void main(String[] args) {
	HomeContext hc=new HomeContext();
	hc.setState(new FreeState());
	hc.setState(new BookedState());
	hc.setState(new CheckedInState());
}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式(8):组合模式

设计模式(9):外观模式

设计模式(10):享元模式

设计模式(11):适配器模式

设计模式(12):代理模式

设计模式(13):模板方法模式

设计模式(14):命令模式

设计模式(15):迭代器模式

设计模式(16):观察者模式

设计模式(17):中介者模式

设计模式持续更新中...

相关推荐
handsome_sai3 小时前
【Java 线程池】记录
java
大学生资源网4 小时前
基于springboot的唐史文化管理系统的设计与实现源码(java毕业设计源码+文档)
java·spring boot·课程设计
guslegend4 小时前
SpringSecurity源码剖析
java
roman_日积跬步-终至千里5 小时前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
大学生资源网5 小时前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计
JasmineWr5 小时前
JVM栈空间的使用和优化
java·开发语言
Hello.Reader5 小时前
Flink SQL DELETE 语句批模式行级删除、连接器能力要求与实战避坑(含 Java 示例)
java·sql·flink
爱笑的眼睛116 小时前
从 Seq2Seq 到 Transformer++:深度解构与自构建现代机器翻译核心组件
java·人工智能·python·ai
Spring AI学习6 小时前
Spring AI深度解析(10/50):多模态应用开发实战
java·spring·ai
workflower7 小时前
用户体验的要素
状态模式·需求分析·个人开发·ux·规格说明书·极限编程