设计模式之状态模式

目录

  • 使用场景
  • 参与者
  • 协作
  • 效果
  • 实现
  • 相关模式
  • 实际应用和思考

状态(State)(对象行为模式)允许一个对象在内部状态改变时改变他的行为。对象看起来似乎修改了他的类

使用场景

  • 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
  • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示;通常有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象不依赖于其他对象而独立变化

参与者

  • Context
    • 定义用户感兴趣的接口
    • 维护一个ConcreteState子类的实例,这个实例定义当前状态
  • State:定义一个接口以封装与Context的一个特定状态相关的行为
  • ConcreteState subclasses:每一个子类实现一个与Context的一个状态相关的行为

协作

  • Context将与状态相关的请求委托给当前的ConcreteState对象处理
  • Context可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要时可访问Context
  • Context是用户使用的主要接口,客户可用状态对象来配置一个Context,一旦一个Context配置完毕它的客户不再需要直接与状态对象打交道
  • Context或ConcreteState子类都可以决定哪一个状态是另外哪个的后继者,以及在何种条件下进行状态转换

效果

  • 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,所以通过定义新的子类可以很容易的增加新的状态和转换,说白了这样做的目的就是为了消除庞大的条件语句(但子类中不可避免的还是出现了条件语句?),状态模式通过把各种状态转移逻辑分布到state的子类之间,来减少相互间的依赖。
  • 使得状态转换显式化:当一个对象仅以内部数据值来定义当前状态时其状态仅表现为对一些变量的赋值,不够明确,为不同的状态引入独立的对象使得转换变得更加明确。
  • State对象可被共享
  • 将不同的状态分布在多个state中增加了子类的数目,相对于单个类的实现来说不够紧凑,但避免了巨大的条件语句

实现

  • 谁定义状态转换:State模式不指定哪一个参与者定义状态转换准则,如果该准则是固定的,可以在Context中实现。然而如果让State子类自身指定他们的后继状态以及何时进行转换会更加灵活,这需要Context增加一个接口让State对象显式的设定Context的当前状态(能不能做到自动转换状态,对Context而言没有感知?)。但为了保证状态改变对外关闭,需要将state类设置为友元
    • 优点:用这种方法分散转换逻辑可以很容易地定义新的state子类来修改和扩展该逻辑
    • 缺点:一个state子类至少拥有一个其他子类的信息,这就在各子类之间产生了实现依赖;并且子类之间很可能是按顺序依赖的,意味着每个状态的下一个状态是什么是固定的——这些依赖的状态的管理是Context还是上一个State?
  • 基于表的另一个方法:将条件代码映射为一个查找表:怎么实现?
  • 创建和销毁State对象
    • 仅当需要state对象时才创建它们并随后销毁它们:当将要进入的状态在运行时不可知,且上下文不经常改变时
    • 提前创建并且始终不销毁:当状态改变很频繁时
  • 使用动态继承

相关模式

  • 享元模式解释了何时以及怎样共享状态对象——?
  • 状态通常是单例

实际应用和思考

  • 状态机与状态模式的区别与联系
  • Context的哪些与状态相关的行为需要在状态类中实现?目前的两个例子似乎都没有体现出来
  • 从目前看,庞大的条件分支只是分发给各个具体的状态类了,并没有消除掉,是哪里的问题?
  • 状态关联的行为由Context去调用还是状态自身调用,如果是状态自身怎么使用,如果是Context调用,那和普通的封装就没有区别了?

在这里插入图片描述

(Context到State的连线意味着State可以离开Context而单独存在)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20697.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux计划任务crontab

顺序是可以任意的, 任意指的是,选项可以都放前面 变量放后面 或者一个选项 一个选项对应的命令 df 查看文件占有情况 d1 只显示1级深度 -h格式好看点 显示所有用户进程和内存进程. uid是所属用户 PPID是父进程 kill终止进程 杀死进程,是正常退出。 如果普通杀不…

spring boot启动原理分析

springboot启动类中有两个关键的地方 1.SpringBootApplication注解 2.SpringApplication.run方法 SpringBootApplication注解分析 SpringBootApplication注解由三大注解构成, SpringBootConfiguration、EnableAutoConfiguration、ComponentScan。 SpringBootCon…

EIK+Filebeat+Kafka

目录 Kafka 概述 为什么需要消息队列(MQ) 使用消息队列的好处 消息队列的两种模式 Kafka 定义 Kafka 简介 Kafka 的特性 Kafka 系统架构 Partation 数据路由规则: 分区的原因 部署 kafka 集群 1.下载安装包 2.安装 Kafka 修改配…

STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060

STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060 Proteus仿真小实验: STM32 Proteus仿真双机串口通讯同步电子时钟系统数码管显示 -0060 功能: 硬件组成:本系统由2个设备组成 设备1:STM32F103R6单片机 8位数…

Jmeter场景设置与启动方式

目录 线程组设置 name和comments Action to be taken after a sampler error Thread Properties 线程属性设置 场景运行 远程运行配置 命令行 性能测试场景是用来模拟模拟真实用户操作的工作单元,所以场景设计一定要切合用户的操作逻辑,jmeter主要…

Python示例解释观察者模式

观察者模式是一种常用的设计模式,用于在对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。下面通过一个简单的例子来解释观察者模式的概念。 假设我们有一个名为"主题"&a…

【IMX6ULL驱动开发学习】20. input子系统(按键实现ls命令)

一、input子系统相关结构体 二、input子系统实例实现: static struct input_dev *key_input;static void my_timer_handle(unsigned long data) {....../* 5.input子系统上报事件 *///第三个参数要变,如果两次上报value相同,则input子系统不会…

【项目管理】成本管理

一.成本管理的概述 在项目上对成本进行管理和控制是为了让项目经理真正了解完成项目所需要消耗的时间和所需要的资源,从而对其进行相应的成本控制。成本管理主要分成以下三个方面的内容: 二.成本估算 成本估算是对整个项目投入的各种资源的成本进行估算&…

java每日一题:手动触发垃圾回收(GC)

面试官: 首先,我想问一下,你能向我解释一下"手动触发Java垃圾回收"的过程吗?🤔 面试者: 在Java中,垃圾回收是自动进行的,由Java虚拟机(JVM)负责管理。但是,有…

30多个小程序一键发布——miniprogram-ci

概述 miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。 开发者可不打开小程序开发者工具,独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。 miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览&#xff0…

Flutter底部导航BottomNavigationBar

Flutter底部导航BottomNavigationBar 主要代码: bottomNavigationBar: BottomNavigationBar(//选中菜单颜色fixedColor: Colors.red,//图标大小,默认24.0iconSize: 30,//第几个菜单选中currentIndex: currentIndex,//当item数量大于3个时需要设置type属…

simulink 结构体 bus creator

目录 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Concatenate 结构体数据存文件 结构体创建 bus creator 结构体引用Bus Selector 结构体赋值Bus Assignment 结构体对象 Bus 结构体数组打包Vector Co…