当前位置: 首页 > 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.xdnf.cn/news/1298467.html

相关文章:

  • OpenAI 的浏览器将使用 ChatGPT Agent 来控制浏览器
  • 记录一些奇奇怪怪的面试题
  • 【慕伏白】CTFHub 技能树学习笔记 -- 基础知识 签到
  • AI 编程实践:用 Trae 快速开发 HTML 贪吃蛇游戏
  • 【软考中级网络工程师】知识点之常用网络诊断和配置命令
  • 机器学习核心概念与实践笔记
  • 解刨HashMap的put流程 <二> JDK 1.8
  • Redis 03 redis 缓存异常
  • Oracle commit之后做了什么
  • OS设备UDID查看方法
  • word——删除最后一页空白页
  • centos部署chrome和chromedriver
  • 【C++】细说继承(2w字详解)
  • OpenCV对椒盐处理后的视频进行均值滤波处理
  • 基于机器学习的文本情感极性分析系统设计与实现
  • [论文阅读] 人工智能 + 软件工程 | 代码变更转自然语言生成中的幻觉问题研究解析
  • 爬虫逆向--Day15--核心逆向案例2(Python逆向实现请求加密、请求堆栈、拦截器关键字)
  • PostgreSQL 免安装
  • SQL详细语法教程(三)mysql的函数知识
  • ActionChains 鼠标操作笔记
  • PyCharm 2025.2:面向工程师的 AI 工具
  • IDEA、Pycharm、DataGrip等激活破解冲突问题解决方案之一
  • C# 中 ArrayList动态数组、List<T>列表与 Dictionary<T Key, T Value>字典的深度对比
  • 20道Vue框架相关前端面试题及答案
  • OpenCV ------图像基础处理(一)
  • Elasticsearch ABAC 配置:基于患者数据的动态访问控制
  • Exif.js获取手机拍摄照片的经纬度
  • 风电功率预测实战:从数据清洗到时空建模​​
  • 机器翻译:回译与低资源优化详解
  • C# 高并发处理方式