当前位置: 首页 > news >正文

设计模式笔记_行为型_状态模式

1. 状态模式介绍

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。状态模式主要用于对象的行为随状态变化而变化的场景。

类比场景:想象一个电风扇,它有不同的档位:关闭、低速、中速和高速。当你按下档位按钮时,电风扇会根据当前档位改变其状态和行为。状态模式就像这个电风扇的档位系统,能帮助电风扇在不同档位下表现出不同的行为。

结构组成:状态模式通常包含以下几个组成部分

  1. Context(上下文):维护一个具体状态的实例(该实例定义了当前的状态),并与客户端交互。
  2. State(状态):定义一个接口,用于封装与上下文相关的行为。
  3. ConcreteState(具体状态):实现状态接口的具体类,每个具体状态类负责实现与其状态相关的行为。

优缺点分析

  • 优点
    • 易于扩展:可以通过增加新的状态类来扩展对象的行为,而不需要修改现有状态类。
    • 清晰的状态转换:状态转换逻辑被封装在具体状态类中,使得状态之间的转换更加清晰。
    • 减少条件语句的使用:避免使用大量的条件语句来处理不同状态的行为。
  • 缺点
    • 类数量增加:每个具体状态都需要一个类,这可能导致类数量迅速增加。
    • 状态之间的紧耦合:状态之间可能会相互依赖,从而导致状态类之间的紧耦合。

适用场景:状态模式适用于以下场景

  • 对象的行为取决于其状态,并且需要在运行时根据状态改变行为。
  • 需要通过状态转换来改变对象的行为。
  • 需要避免使用大量的条件语句来处理对象的不同状态。

2. 代码演示

场景:使用状态模式实现电风扇档位的切换。

State(状态):封装与上下文的一个特定状态相关的行为

// 状态接口; Fan是上下文类
public interface FanState {void turnUp(Fan fan);void turnDown(Fan fan);
}

ConcreteState(具体状态):每个具体状态类负责实现与其状态相关的行为

// 具体状态类:风扇关闭状态
public class OffState implements FanState {@Overridepublic void turnUp(Fan fan) {System.out.println("Turning fan to low speed.");fan.setState(new LowState());}@Overridepublic void turnDown(Fan fan) {System.out.println("Fan is already off.");}
}// 具体状态类:风扇低速状态
public class LowState implements FanState {@Overridepublic void turnUp(Fan fan) {System.out.println("Turning fan to medium speed.");fan.setState(new MediumState());}@Overridepublic void turnDown(Fan fan) {System.out.println("Turning fan to off.");fan.setState(new OffState());}
}// 具体状态类:风扇中速状态
public class MediumState implements FanState {@Overridepublic void turnUp(Fan fan) {System.out.println("Turning fan to high speed.");fan.setState(new HighState());}@Overridepublic void turnDown(Fan fan) {System.out.println("Turning fan to low speed.");fan.setState(new LowState());}
}// 具体状态类:风扇高速状态
public class HighState implements FanState {@Overridepublic void turnUp(Fan fan) {System.out.println("Fan is already at high speed.");}@Overridepublic void turnDown(Fan fan) {System.out.println("Turning fan to medium speed.");fan.setState(new MediumState());}
}

Context(上下文):维护一个具体状态的实例,这个实例定义了当前的状态

// 上下文类:风扇
public class Fan {private FanState currentState;public Fan() {currentState = new OffState(); // 初始状态为关闭}public void setState(FanState state) {currentState = state;}public void turnUp() {currentState.turnUp(this);}public void turnDown() {currentState.turnDown(this);}
}

客户端:只与上下文(Fan)打交道,不涉及直接接触具体状态

public class StatePatternDemo {public static void main(String[] args) {Fan fan = new Fan();fan.turnUp();   // Turning fan to low speed.fan.turnUp();   // Turning fan to medium speed.fan.turnDown(); // Turning fan to low speed.fan.turnDown(); // Turning fan off.}
}

对应的类图:

http://www.dtcms.com/a/331545.html

相关文章:

  • Spring Boot + Redis Sentinel (一主两从)测试案例
  • Docker pull拉取镜像命令的入门教程
  • 蓝耘元生代上线 Baichuan-M2-32B,医疗推理能力卓越,高效部署,成本超低
  • Varjo XR虚拟现实军用车辆驾驶与操作培训
  • SaltStack部署应用
  • MCP入门:Python开发者的模型上下文协议实战指南
  • VSCode打开新的文件夹之后当前打开的文件夹被覆盖
  • 百度智能云x中科大脑:「城市智能体」如何让城市更会思考
  • 如何启动本机mysql数据库
  • 软件架构需求过程:构建高质量系统的基石
  • C#面试题及详细答案120道(01-10)-- 基础语法与数据类型
  • 【Android】RecyclerView复用CheckBox的异常状态
  • 容器方式安装Prometheus以及Grafana
  • 《疯狂Java讲义(第3版)》学习笔记ch4
  • C# 贪吃蛇游戏
  • js加密逆向
  • Chrome插件开发实战:从零开发高效Chrome插件,提升浏览器生产力
  • 通过 USB 配置闭环驱动器——易格斯igus
  • glTF-教程/glb-教程
  • tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
  • AI硬件小众赛道崛起:垂直场景的价值重构与增长密码。
  • Java高级流
  • 公链开发竞争白热化:如何设计下一代高性能、可扩展的区块链基础设施?
  • 云手机的存储功能怎么样?
  • 一次 Unity ↔ Android 基于 RSA‑OAEP 的互通踩坑记
  • Android ADB 常用指令全解析
  • ADB服务端调试
  • markdown格式中table表格不生效,没有编译的原因
  • Mybatis Plus 分页插件报错`GOLDILOCKS`
  • 视频号主页的企业信息如何设置?