对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化。在程序设计方面可能要比其它模式略微复杂点,请待我慢慢将来。

本人喜欢用代码来形象的讲述原理,可能是由于对单纯的看些理论的书有些反感或者无趣吧。我希望以后的教育也如此,要不大家都不高考了。

。嘿嘿说多了

状态模式:当一个对象的内在状态改变时同意改变其行为。这个对象看起来像是改变了其类。

还是代码呈现吧。概念太抽象了。

1、状态类。在该状态干什么

/**

* @author jzhf

*/

public
interface
State {

//在设定状态下做什么工作

public
void
writeProgram(Work work);

}

2、工作类,记录了当前状态的时间、完毕情况、当前状态

public
class
Work {

private
int
hour;//工作时间

private
boolean
finished;

private State
currentState;

public Work(){

currentState =
new
ForenoonState();//上午九点開始上班

}

//完毕工作状态设置

public
boolean
taskFinished(){

return
finished;

}

//工作内容

public
void
writeProgram(){

currentState.writeProgram(this);

}

public
int
getHour() {

return
hour;

}

public
void
setHour(int hour) {

this.hour = hour;

}

public
boolean
isFinished() {

return
finished;

}

public
void
setFinished(boolean finished) {

this.finished = finished;

}

public State getCurrentState() {

return
currentState;

}

public
void
setCurrentState(State currentState) {

this.currentState = currentState;

}

}

3、上午九点状态

public
class
ForenoonState implements State {

/* (non-Javadoc)

* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

*/

public
void
writeProgram(Work work) {

// TODO Auto-generated method stub

if(work !=
null){

//当在上午工作时

if(work.getHour() < 12){

System.out.println("当前时间:"+work.getHour()+"点 
上午工作,精神百倍");

}else{

//否则转到下午工作状态

work.setCurrentState(new NoonState());

work.writeProgram();

}

}

}

}

4、中午状态

public
class
NoonState implements State {

/* (non-Javadoc)

* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

*/

public
void
writeProgram(Work work) {

// TODO Auto-generated method stub

if(work !=
null){

//当在下午时

if(work.getHour() <13){

System.out.println("当前时间:"+work.getHour()+"点 
犯困。午休");

}else{

//否则转到下午工作状态

work.setCurrentState(new AfterNoonState());

work.writeProgram();

}

}

}

}

5、下午状态

public
class
AfterNoonState implements State {

/* (non-Javadoc)

* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

*/

public
void
writeProgram(Work work) {

// TODO Auto-generated method stub

if(work !=
null){

//当在下午时

if(work.getHour() <17){

System.out.println("当前时间:"+work.getHour()+"点 
下午状态还不错。继续努力");

}else{

//否则转到晚上工作状态

work.setCurrentState(new EveningState());

work.writeProgram();

}

}

}

}

6、晚上加班状态

public
class
EveningState implements State {

/* (non-Javadoc)

* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

*/

public
void
writeProgram(Work work) {

// TODO Auto-generated method stub

if(work !=
null){

//当在下午时

if(work.taskFinished()){

System.out.println("当前时间:"+work.getHour()+"点 
下班了。。

。");

work.setCurrentState(new SleepingState());

work.writeProgram();

}else
if
(work.getHour() <21){

System.out.println("当前时间:"+work.getHour()+"点 
加班中。

。。");

}

}

}

}

7、假设不加班。直接睡觉,状态结束

public
class
SleepingState implements State {

/* (non-Javadoc)

* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)

*/

public
void
writeProgram(Work work) {

// TODO Auto-generated method stub

System.out.println("当前时间:"+work.getHour()+"点 
睡觉了。");

}

}

8、client

public
class
StateClient {

/**

* @param args

*/

public
static void
main(String[] args) {

// TODO Auto-generated method stub

Workwork = new Work();

work.setHour(9);//開始上班

work.writeProgram();//開始工作

work.setHour(11);

work.writeProgram();

work.setHour(12);

work.writeProgram();

work.setHour(13);

work.writeProgram();

work.setHour(14);

work.writeProgram();

work.setHour(17);

//假设没有工作完继续

work.setFinished(true);

work.writeProgram();

work.setHour(21);

work.writeProgram();

work.setHour(22);

work.setFinished(true);

work.writeProgram();

}

}

通过代码讲述一个故事,对状态模式有了非常形象的诠释,我想不用解释也能理解状态模式是什么了,就是一个过程的某个点的状态,而且该状态是由顺序的。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的推断逻辑转移到表示不同状态的一系列类其中。能够把复杂的推断逻辑简化。

总结:状态模式就是将与特定状态相关的行为局部化,而且将不同状态的行为切割开来,说白了目的就是为了消除庞大的条件分支语句。

&lt;十二&gt;读&lt;&lt;大话设计模式&gt;&gt;之状态模式的更多相关文章

  1. &lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

    又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...

  2. &lt;四&gt;读&lt;&lt;大话设计模式&gt;&gt;之代理模式

    代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种 ...

  3. &lt;五&gt;读《《大话设计模式》》之工厂模式

    怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...

  4. 《大话设计模式》c++实现 状态模式

    状态模式包含如下角色: Context: 环境类 State: 抽象状态类 ConcreteState: 具体状态类 2)适用场景: a)状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂 ...

  5. 大话设计模式C++版——抽象工厂模式

    前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...

  6. 大话设计模式C++版——工厂方法模式

    工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...

  7. &lt;十一&gt;读&lt;&lt;大话设计模式&gt;&gt;之抽象工厂模式

    学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难.就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便.抽象工厂模式名字听起来抽象.但理解起来一点也不抽象,用语言 ...

  8. &lt;一&gt;读&lt;&lt;大话设计模式&gt;&gt;之简单工厂模式

    工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...

  9. 大话设计模式C++版——简单工厂模式

    简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...

随机推荐

  1. shell文件包含

    像其他语言一样,Shell 也可以包含外部脚本,将外部脚本的内容合并到当前脚本. Shell 中包含脚本可以使用: . filename 或 source filename 两种方式的效果相同,简单起 ...

  2. Apple Pay强势来袭,开发者应做的事情(转)

    "iOS8.1就已经有这个功能了,只是木有现在这么的火,现在的趋势是要火的节奏,因此很多电商平台B2B,P2P,C2C,X2X都有可能需要这个屌丝的付款功能了,在此简单的研究一下." ...

  3. Luogu【P2904】跨河(DP)

    题目链接在这里 此题DP.用一个前缀和一样的东西,把载i个奶牛的时间求出来,然后DP代码如下: ;i<=n;++i){ f[i]=que[i]; ;j<i;++j) f[i]=min(f[ ...

  4. 【Luogu】P3800点收集(DP)

    题目链接 原题解 代码 #include<iostream> #include<cstdio> #include<cstring> #include<ccty ...

  5. BZOJ 4516 [Sdoi2016]生成魔咒 ——后缀自动机

    本质不同的字串,考虑SA的做法,比较弱,貌似不会. 好吧,只好用SAM了,由于后缀自动机的状态最简的性质, 所有不同的字串就是∑l[i]-l[fa[i]], 然后后缀自动机是可以在线的,然后维护一下就 ...

  6. 刷题总结——营业额统计(bzoj1588)

    题目: Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成 ...

  7. 刷题总结:最长公共字串(spoj1811)(后缀自动机)

    题目: 就不贴了吧···如题: 题解: 后缀自动机模版题:没啥好说的···· 代码: #include<iostream> #include<cstdio> #include& ...

  8. 【单调队列+尺取】HDU 3530 Subsequence

    acm.hdu.edu.cn/showproblem.php?pid=3530 [题意] 给定一个长度为n的序列,问这个序列满足最大值和最小值的差在[m,k]的范围内的最长子区间是多长? [思路] 对 ...

  9. Tarjan 算法 自学整理

    算法介绍 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子图,称为强连通分量( ...

  10. Codevs 1021 玛丽卡==洛谷 P1186

    时间限制: 2 s 空间限制: 128000 KB  题目等级 : 大师 Master  题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个 ...