设计模式之 State(状态模式)通俗理解
23种设计模式
1 State 模式的定义
不同的状态,不同的行为;或者说,每个状态有着相应的行为。
2 何时使用?
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了它的类。状态模式主要解决的是当控制一个对象状态转接的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的逻辑简化。
State 模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用 If else ifelse 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取 State 模式了。
不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上 property 属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用 State。
3 是否使用?
在实际使用,类似开关一样的状态切换是很多的,但有时并不是那么明显,取决于你的经验和对系统的理解深度。
4 如何使用?
举例:程序员一天的工作状态,随着时间而变化:
当前时间9.0点 上午工作,精神百倍
当前时间10.0点 上午工作,精神百倍
当前时间12.0点 饿了,午饭;犯困,午休。
当前时间13.0点 下午状态不错,继续努力
当前时间14.0点 下午状态不错,继续努力
当前时间17.0点 加班哦,疲惫至极
当前时间17.0点 加班哦,疲惫至极
当前时间19.0点 加班哦,疲惫至极
当前时间22.0点 不行了,睡着了。
一般做法if else 判断
package xx.study.design.state;/***方法过长*/
class IfWork{private int hour;private Boolean finish=false;public int getHour() {return hour;}public void setHour(int hour) {this.hour = hour;}public Boolean getFinish() {return finish;}public void setFinish(Boolean finish) {this.finish = finish;}public void WriteProgram() {if(hour<12) {System.out.println("当前时间:"+hour+"点上午工作,精神百倍");}else if(hour<13) {System.out.println("当前时间:"+hour+"点饿了,午饭;犯困,午休");}else if(hour<17) {System.out.println("当前时间:"+hour+"点下午状态还不错,继续努力");}else {if(finish) {System.out.println("当前时间:"+hour+"点 下班回家了");}else {if(hour<21) {System.out.println("当前时间:"+hour+"点 加班哦,疲惫至极");}else {System.out.println("当前时间:"+hour+"点 不行了,睡着了。");}}}}
}class Main{public static void main(String[] args){IfWork emergencyProjects=new IfWork();emergencyProjects.setHour(9);emergencyProjects.WriteProgram();emergencyProjects.setHour(10);emergencyProjects.WriteProgram();emergencyProjects.setHour(12);emergencyProjects.WriteProgram();emergencyProjects.setHour(14);emergencyProjects.WriteProgram();emergencyProjects.setHour(17);emergencyProjects.WriteProgram();emergencyProjects.setFinish(false);emergencyProjects.WriteProgram();emergencyProjects.setHour(19);emergencyProjects.WriteProgram();emergencyProjects.setHour(22);emergencyProjects.WriteProgram();}
}
使用state模式
package xx.study.design.state;public interface State{public abstract void WriteProgram(Work w);
}
class Work{private State current;private double hour;private boolean finish=false;public Work() {//创建构造第一个条件current=new ForenoonState();}public State getCurrent() {return current;}public void setCurrent(State current) {this.current = current;}public double getHour() {return hour;}public void setHour(double hour) {this.hour = hour;}public boolean isFinish() {return finish;}public void setFinish(boolean finish) {this.finish = finish;}public void SetState(State s) {current=s;}public void WriteProgram() {current.WriteProgram(this);}
}
class ForenoonState implements State{public void WriteProgram(Work w) {if(w.getHour()<12) {System.out.println("当前时间"+w.getHour()+"点 上午工作,精神百倍");}else {w.SetState(new NoonState());w.WriteProgram();}}
}
class NoonState implements State{public void WriteProgram(Work w) {if(w.getHour()<13) {System.out.println("当前时间"+w.getHour()+"点 饿了,午饭;犯困,午休。");}else {w.SetState(new AfternoonState());w.WriteProgram();}}
}
class AfternoonState implements State{public void WriteProgram(Work w) {if(w.getHour()<17) {System.out.println("当前时间"+w.getHour()+"点 下午状态不错,继续努力");}else {w.SetState(new EveningState());w.WriteProgram();}}
}
class EveningState implements State{public void WriteProgram(Work w) {if(w.isFinish()) {w.SetState(new RestState());w.WriteProgram();}else{if(w.getHour()<21) {System.out.println("当前时间"+w.getHour()+"点 加班哦,疲惫至极");}else {w.SetState(new SleepingState());w.WriteProgram();}}}
}
class SleepingState implements State{public void WriteProgram(Work w) {System.out.println("当前时间"+w.getHour()+"点 不行了,睡着了。");}
}
class RestState implements State{public void WriteProgram(Work w) {System.out.println("当前时间"+w.getHour()+"点 下班回家了");}
}
class StateDemo{public static void main(String[] args){//创建构造第一个条件 NoonState Work emergencyProjects=new Work();emergencyProjects.setHour(9);//每次赋值后在进行判断进入哪种状态emergencyProjects.WriteProgram();emergencyProjects.setHour(10);emergencyProjects.WriteProgram();emergencyProjects.setHour(12);emergencyProjects.WriteProgram();emergencyProjects.setHour(13);emergencyProjects.WriteProgram();emergencyProjects.setHour(14);emergencyProjects.WriteProgram();emergencyProjects.setHour(17);emergencyProjects.WriteProgram();emergencyProjects.setFinish(false);emergencyProjects.WriteProgram();emergencyProjects.setHour(19);emergencyProjects.WriteProgram();emergencyProjects.setHour(22);emergencyProjects.WriteProgram();}
}
5 优缺点
优点:
将与特定状态相关的行为局部化,并且将不同状态的行为分割开来消除庞大的条件分支语句,把各种状态转移逻辑分布到State的子类之间,减少了相互间的依赖。
显式化进行状态转换:为不同的状态引入独立的对象,使得状态的转换变得更加明确。而且状态对象可以保证上下文不会发生内部状态不一致的状况,因为上下文中只有一个变量来记录状态对象,只要为这一个变量赋值就可以了。
缺点:
State模式问题主要是逻辑分散化,状态逻辑分布到了很多的State的子类中,很难看到整个的状态逻辑图,这也带来了代码的维护问题。
设计模式之 State(状态模式)通俗理解相关推荐
- Java 设计模式之 State 状态模式
状态模式用于根据状态决定行为的场景. 比如一个人处于不同的心情时,会说不同的话,会做不同的事情,说话和做事由状态决定. 这里可以将心情设计为一个抽象类,开心,伤心,抑郁时的说话,做事的行为作为抽象方法 ...
- 设计模式21:State 状态模式(行为型模式)
State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
- 设计模式之略见一斑(状态模式State)
设计模式中的状态模式相对比较简单,简单的说就是对某个对象的状态进行管理.对象的状态如果的多的话,假如没有对其进行管理,极易造成管理混乱.从而使系统难以维护,所以State模式的意图就是将与状态有关的处 ...
- 【游戏设计模式】之三 状态模式、有限状态机 Unity版本实现
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星云(浅 ...
- 【游戏设计模式】之三 状态模式 有限状态机 Unity版本实现
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/52824776 作者:毛星 ...
- 【游戏设计模式】之三 状态模式、有限状态机
转载自:https://blog.csdn.net/poem_qianmo/article/details/52824776 游戏开发过程中,各种游戏状态的切换无处不在.但很多时候,简单粗暴的if e ...
- 5.8 设计模式之State(状态)—对象行为型模式
5.8 State(状态)-对象行为型模式 参考文章 意图 状态模式是一种行为设计模式, 改变一个对象的内部状态进而改变其行为. 问题及情景 状态模式与有限状态机的概念紧密相关. 其主要思想是程序在任 ...
- 《研磨设计模式》chap18 状态模式state(1)模式简介
场景:投票管理 1. 正常编码 //投票管理 public class VoteManager {//记录用户投票的结果,Map<String,String>对应Map<用户名称,投 ...
- [设计模式-行为型]状态模式(State)
一句话 在一个类的对象中维护状态的类的对象 概括 解析 STATE-跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上去看电影,对你没兴趣的MM就会说 " ...
最新文章
- Linux Centos6.5 SVN服务器搭建 以及客户端安装
- archlinux详细安装步骤_最新Centos的liunx安装宝塔的详细步骤
- linux使用什么ide编译安卓,抛弃IDE,使用gradle命令与vim构建安卓应用
- sql的join语法解析
- 锁屏界面_强迫症必爱!iPhone怎样隐藏锁屏界面的手电筒、相机图标?
- 亚马逊出的平板电脑_亚马逊发布Fire HD 8新系列平板电脑,90美元起
- backup archivelog delete input 与delete all input 区别
- QGIS无人机数据分析教程
- FusionChartsFree设置指南
- 硬件之家 | 智能手环、手表是如何监测睡眠的
- matlab 去除图片坐标值和白边,并用saveas函数按需要分辨率(尺寸)保存
- Java使用thumbnailator批量压缩JPG图片、加水印
- 用python编写倒计时_python如何倒计时
- 如何用html语言制作圆角矩形,webGL中圆角矩形的绘制
- 主谓宾定状补......
- 重装系统后dns服务器未响应,dns服务器未响应,小编教你dns服务器未响应怎么解决...
- 树莓派3B Qt+dht11读取温湿度并写入数据库202005(8)
- 反向代理和正向代理的概念
- 每日一诗词 —— 越人歌
- 阿里云服务器试用一哈