状态模式
来源:互联网 发布:免费淘宝网店模板 编辑:程序博客网 时间:2024/05/29 11:42
状态模式:用官方的话来说就是,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。说白了这个模式就是为了消除庞大的分支语句。
使用场景:
官方话来说就是,当一个对象的行为取决于他的状态,并且他在运行的时刻根据状态改变他的行为时使用,其实就是出现特别复杂庞大的分支语句的时候,或者因为这些分之语句导致耦合性特别高的时候使用。
优点:
将与特定状态相关的的行为局部化,并且将不同的状态的行为分割开来。
UML图:
实现代码
package com.liran.main.DesignPattern.状态模式;/** * 状态模式 * Created by LiRan on 2016-02-22. */public class StatePattern { public static void main(String[] args) { Context context = new Context(new ConcreteStateA()); //切换状态 context.requst(); context.requst(); context.requst(); }}abstract class State { public abstract void Handle(Context context);}class ConcreteStateA extends State { @Override public void Handle(Context context) { context.setState(new ConcreteStateB()); } @Override public String toString() { return "ConcreteStateA"; }}class ConcreteStateB extends State { @Override public void Handle(Context context) { context.setState(new ConcreteStateA()); } @Override public String toString() { return "ConcreteStateB"; }}class Context { private State state; public Context(State state) { this.state = state; } public State getState() { return state; } public void setState(State state) { this.state = state; System.out.println("现在的状态是:" + state.toString()); } public void requst() { state.Handle(this); }}
华丽的分割线
还是不太懂:
我知道,上面的东西有点抽象,这个模式我也是第一遍没看懂,后来做了一个实例,然后就明白了,这样来吧,咱们假设一个情景:程序员加班都是家常便饭,但是有些时候的加班是因为没有完成工作任务而加班的,不仅没有加班费,当项目紧的时候有可能一个月都在加班,这样效率很不好,早上应该还能精神百倍的写代码,但是中午吃饭的时候就会犯困,要等到下午才能恢复工作的经理,到了下班的时间如果没有完成那就要加班,如果已经完成了,那就可以下班回家睡觉了,如果加班太晚的话,那就会在公司睡着了,就是这么一个情景,如果按照以前的写法,肯定又是一堆的判断语句,这样很不好,比如突然要增加下午茶时间,那个时间都不敲代码,这个东西改起来就比较麻烦,而且容易出错,并且也不够清晰,代码会显得逻辑很乱,如果采用状态模式
,那我们就可以把每一个判断分之都弄成一种类,然后有一个抽象的状态类,来一个工作类进行调度,具体代码如下:
实例代码二:
package com.liran.main.DesignPattern.状态模式;/** * 演示例子 * Created by LiRan on 2016-02-22. */public class StatePattern_example { public static void main(String[] args) { Work work = new Work(); work.hour = 9; work.writeProgram(); work.hour = 11; work.writeProgram(); work.hour = 12; work.writeProgram(); work.hour = 15; work.writeProgram(); work.isFinish=true; work.hour = 19; work.writeProgram(); work.hour = 21; work.writeProgram(); work.hour = 22; work.writeProgram(); work.hour = 23; work.writeProgram(); }}class Work { public int hour; public boolean isFinish; private WorkState current; public Work() { current = new MorinigState(); } public WorkState getState() { return current; } public void setState(WorkState current) { this.current = current; } public void writeProgram() { current.writeProgram(this); }}/** * 抽象工作状态类 */abstract class WorkState { abstract public void writeProgram(Work w);}/** * 上午工作状态 */class MorinigState extends WorkState { @Override public void writeProgram(Work w) { if (w.hour < 12) { System.out.println("当前时间是:" + w.hour + " 精神百倍"); } else { w.setState(new noonState()); w.writeProgram(); } }}/** * 中午工作状态 */class noonState extends WorkState { @Override public void writeProgram(Work w) { if (w.hour < 13) { System.out.println("当前时间是:" + w.hour + " 吃午饭 困 午休 "); } else { w.setState(new afternoonState()); w.writeProgram(); } }}/** * 下午工作状态 */class afternoonState extends WorkState { @Override public void writeProgram(Work w) { if (w.hour < 17) { System.out.println("当前时间是:" + w.hour + " 感觉状态还不错 "); } else { w.setState(new eveningState()); w.writeProgram(); } }}/** * 晚上工作状态 */class eveningState extends WorkState { @Override public void writeProgram(Work w) { if (w.isFinish) { w.setState(new restState()); w.writeProgram(); } else { if (w.hour < 21) { System.out.println("当前时间是:" + w.hour + " 加班啊 "); } else { w.setState(new SleepingState()); w.writeProgram(); } } }}class SleepingState extends WorkState { @Override public void writeProgram(Work w) { System.out.println("当前时间是:" + w.hour + " 不行了 睡着了 "); }}class restState extends WorkState { @Override public void writeProgram(Work w) { System.out.println("当前时间是:" + w.hour + " 下班回家了 "); }}
运行结果:
工作完成的话:
当前时间是:9 精神百倍
当前时间是:11 精神百倍
当前时间是:12 吃午饭 困 午休
当前时间是:15 感觉状态还不错
当前时间是:19 下班回家了
当前时间是:21 下班回家了
当前时间是:22 下班回家了
当前时间是:23 下班回家了
不能完成的话:
当前时间是:9 精神百倍
当前时间是:11 精神百倍
当前时间是:12 吃午饭 困 午休
当前时间是:15 感觉状态还不错
当前时间是:19 加班啊
当前时间是:21 不行了 睡着了
当前时间是:22 不行了 睡着了
当前时间是:23 不行了 睡着了
源码下载:Github
有什么疑问的地方欢迎评论。
- 状态模式(状态变化)
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- 状态模式
- The Swift Programming Language学习笔记(八)——闭包
- golang语法总结(十九):结构struct
- PHP初学之运算符
- 企业级发布必备条件(299&SSL证书)
- Android学习架构图
- 状态模式
- 梯度下降和随机梯度下降为什么能下降?
- leetcode single numbers I II III
- golang语法总结(二十):struct组合
- java平台脚本+java编译器API
- 蓝桥杯 奖券数目 (暴力)
- PHP初学之控制结构
- 企业发布设置下载链接与plist文件
- The Swift Programming Language学习笔记(九)——枚举