设计模式之状态

状态模式介绍

状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。

根据状态不同,行为也不同

状态模式描述的是一个行为下的多种状态变更,比如我们最常见的一个网站的页面,在你登录与不登录时,用户看到的页面是不同的,而这种登录与不登录就是我们通过改变状态而让整个行为发生了变化。

状态模式建议为对象的所有可能状态新建一个类,然后将所有状态的对应行为抽取到这些类中。

原始对象被称为上下文,它并不会自行实现所有行为,而是会保存一个指向表示当前状态对象的引用,且将所有与状态相关的工作委派给该对象。

状态模式结构

  • 1、上下文

保存对于一个具体状态对象的引用,并会将所有与该状态相关的工作委派给它。上下文通过状态接口与状态对象交互,且会提供一个设置器用于传递新的状态对象。

  • 2、状态接口

会声明特定于状态的方法,这些方法应能被其他所有具体状态所理解,因为你不希望某些状态所拥有的方法永远不会被调用。

  • 3、具体状态

会自行实现特定于状态的方法。为了避免多个状态中包含相似代码,你可以提供一个封装有部分通用行为的中间抽象类。

  • 4、业务逻辑

上下文和具体状态都可以设置上下文的下个状态,并可通过替代连接到上下文的状态对象来完成实际的状态转换。

状态模式的应用场景

  • 对象需要根据自身当前状态进行不同行为,同时状态的数量非常多且与状态相关的代码会频繁变更的话。

  • 某个类需要根据成员变量的当前值改变自身行为,从而需要使用大量的条件语句时。

  • 当相似状态和基于条件的状态机转换中存在许多重复代码时,可使用状态模式。

实现方式

  • 确定那些类是上下文,声明状态接口。

  • 为每个实际状态创建一个继承与状态接口的类,然后检查上下文中的方法并将与特定状态相关的所有代码抽取到新建的类中。

  • 在上下文类中添加状态接口类型的引用成员变量。

  • 再次检查上下文中的方法,将空的条件语句替换为响应的状态对象方法。

  • 传递上下文状态。

满足单一职责原则和开闭原则。

Demo

该模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。

状态模式可通过受外部控制且能根据对象状态改变行为的方法来识别。

抽象的状态类

抽象的状态类

实现抽象状态类

抽象实现类

上下文类

客户端调用

客户端代码
输出结果

对于状态模式来说,还是得根据具体得业务场景去实现,就是当某个状态改变时,对应业务中有好多耦合得类也得对应做不同得变化时就可以使用状态模式。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

- END -

往期推荐

设计模式总览

设计模式之简单工厂

设计模式之抽象工厂

设计模式之建造者

设计模式之原型

设计模式之单例

设计模式之适配器

设计模式之桥接

设计模式之组合

设计模式之装饰器

设计模式之外观

设计模式之享元

设计模式之代理

设计模式之责任链

设计模式之命令

设计模式之迭代器

设计模式之中介者

设计模式之备忘录

设计模式之观察者

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

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

相关文章

阿里最新面试必备项之Java的String类,持续更新中!

最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都作为此类的实例实现。 String是一个final类,代表不可变的字符序列。…

Juster的MVP奋斗之路

大家好是朱震(juster zhu)MVP唯一id是5004326,这里主要给大家分享一下参选上MVP喜悦。首先非常感谢大伙对我的支持,在过去的8个多月里几乎每天都在写博客和做视频以及回答技术问题中度过。整个过程非常艰苦,身体不好真…

被嫌弃的蝗虫的一生

全世界只有3.14 % 的人关注了爆炸吧知识转载来源:混子曰部分素材源于网络,版权归原作者所有如有侵权请留言联系删除,感谢合作选购数学科普正版读物严选“数学思维好物”送给孩子的阅读礼物 | 办公室神器有益孩子一生的玩具 | 居家高科…

直接裂开!京东二面被问SpringBoot整合MongoDB,我不会啊

开始进入正题 一、技术介绍 SpringBoot整合MongoDB的实现步骤一、技术介绍1.MongoDB是什么?二、使用步骤1.MongoDB是什么? MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各…

复工后,看看他们都是怎么上班的!

全世界只有3.14 % 的人关注了爆炸吧知识来源:大叔爱吐槽 人民日报本周全国各地终于逐步复工!听!小伙伴在召唤你!你大概从未想过,有一天自己竟会盼望上班?困守家中的20多天,积累了天量防疫知识&a…

使用 OpenLDAP 集中管理用户帐号

关键字: OpenLDAP ReiserFS SCTP nmon 正则表达式 使用轻量级目录访问协议(LDAP)构建集中的身份验证系统可以减少管理成本,增强安全性,避免数据复制的问题,并提高数据的一致性。随着 Linux® 的不断…

【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~

以前我刚入行,总是会犯这样几个常见错误,后面想起来是真的SB。当然每个程序员会犯错,重要的是从中吸取教训,得到成长。那么这些错误到底是什么呢?我来给大家盘点一下!!! 当我感觉我…

解决ubuntu下eclipse 经常崩溃的问题

2019独角兽企业重金招聘Python工程师标准>>> ubuntu对SWT程序支持的不怎么好,基于SWT的eclipse在ubuntu下经常崩溃和失去响应,要解决这个问题需要1.需要卸载掉 overlay-scrollbar libwebkit-1.02.eclipse.ini中加入 -Dsun.awt.disablegrabtru…

揭秘神仙高校的课堂!网友跪了:这就是差距啊!

全世界只有3.14 % 的人关注了爆炸吧知识疫情之下,家家闭门谢客,宅着就是做贡献了。原本一晃而过的7天假期变得“漫长”,延迟复工、居家办公;学生党们把寒假过成了暑假。随着各高校公布延迟开学时间到二月底,各种网络直…

oracle中prad函数_024 SQL函数

1. 使用ORDER BY排序(1) ORDER BY 子句的作用是什么?用ORDER BY子句排序。用于对结果集进行排序处理,提供了升序排序(ASC)与降序排序(DESC)如果不指定排序规则默认为升序排序。在排序中也可以使用没有包括在…

世道变了,面试初级Java开发会问到Arrays!!!你不会还不知道吧!

一、基本定义 Arrays类&#xff0c;全路径java.util.Arrays&#xff0c;主要功能为操作数组&#xff0c;Arrays类的所有方法均为静态方法&#xff0c;所以 调用方式全部为Arrays.方法名 二、常用方法 1. <T> List<T> asList(T... a)可以将数组转化为相应的lis…

DNS(三)--子域授权和视图

实验题目&#xff1a;1.子域授权&#xff08;委派&#xff09;2.视图实验环境&#xff1a;1.vmware虚拟机2.linux子机两台3.XP测试机实验过程&#xff1a;一、子域授权在现实生活中我们世界互联网中的每个主机并不是在同一个域内&#xff0c;而是通过不同的依据将将其划分到不同…

11尺寸长宽 iphone_LED显示屏的尺寸规格计算方法

LED屏幕在生活中&#xff0c;随处可见&#xff0c;显示屏、广播屏等等&#xff0c;但是LED尺寸怎么计算的&#xff0c;你知道吗&#xff1f;今天我们来了解一下LED屏幕尺寸的计算方法。一、点间距的计算1、各单元板常见型号及尺寸LED屏普遍是用单元板做的。LED单元板常见型号及…

盘点数学里十大不需语言的证明

全世界只有3.14 % 的人关注了爆炸吧知识当谈到复杂数学定理的证明时&#xff0c;很多人常常为之色变&#xff0c;认为这只是一个枯燥的公式堆砌和深奥的数学推导过程。这当然是一个让笔者感到纠结的误解。因为数学证明中包含的美丽与精巧实在是一道亮丽的风景线&#xff0c;而这…

好端端的程序员,咋就成了新生代农民工!

实锤&#xff0c;程序员被划为新生代农民工&#xff0c;码农的称号终获官方认定&#xff0c;网上一片热议。虽然农民工的称呼有点突兀&#xff0c;然而更多的评论都是在羡慕程序员的高薪&#xff0c;尤其是那些能进一线大厂的幸运儿。往年.NET进大厂难&#xff0c;而今年腾讯、…

大厂Java初级开发工程师!!!面试必问项之Set实现类:TreeSet

一、TreeSet 概述 1、TreeSet是 SortedSet 接口的实现类&#xff0c; TreeSet 可以确保集合元素处于排序状态。 2、TreeSet顾名思义他内部维护的是一个TreeMap&#xff0c;底层是红黑二叉树&#xff0c;他使得集合内都是有序的序列。 3、Tree可以按照添加对象的指定属性&…

【Android笔记】如何创建列表视图3

接着上一篇实现一个带有复选框的列表视图&#xff0c;这要求对Adapter有比较清楚的理解。1. ArrayAdapter从Layout读取TextView控件&#xff0c;返回给ListView显示&#xff0c;这个处理在ArrayAdapter的getView方法里&#xff0c;我们可以继承这个类&#xff0c;覆盖getView&…

史上最硬核的数学老师!搞发明、造大炮,让战斗民族直叫爸爸,看完我跪了......

全世界只有3.14 % 的人关注了爆炸吧知识一直以来&#xff0c;有好多朋友在后台和知识君吐槽&#xff0c;自己在追逐菲尔兹奖的路上总被数学公式所绊倒&#xff0c;一见到数学公式就头疼&#xff01;这时&#xff0c;知识君就会搬出数学史上最萌的公式——“么么哒”公式&#x…

a标签传参接收_[pyecharts1.8] 系列配置之标签设置

今日心情 &#xff1a;em....又是一堆蛋疼的事情堆积的一周...文章会迟到&#xff0c;但不会缺席&#xff0c;准备好脑子接收下[pyecharts1.8] 系列配置之标签设置本文档(以及pyecharts使用手册中的其他文档)将会持续更新。 有些内容标记为待更新的&#xff0c;有时间我会补充上…

这个寒冬,如何让我们的身价翻倍?

这个寒冬&#xff0c;如何让我们的身价翻倍&#xff1f; ——《深入理解.NET&#xff08;第2版英文版&#xff09;》读后感 微软4大名著评选结果揭晓 在开始正文之前&#xff0c;我先给大家讲一个真实的故事&#xff1a;我有一位朋友&#xff0c;他的一位同学原来是做测试的&am…