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

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

。嘿嘿说多了

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

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

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. mac 打开apach 但无法访问localhost的解决方法

    y由于mac系统默认自带了PHP和Apach, 所以可以通过 sudo apachectl start 直接启动apach服务, 此时在浏览器输入http://localhost,会出现It work ...

  2. 鼠标移动或者鼠标点击div消失不见排查

    点击事件,导致某div或者容器样式隐藏,如果不能直接发现click事件绑定,那么首先排查哪些方法在控制div的样式, 然后看一看哪些方法在调用修改样式的方法. 然后再排查什么在调用修改样式的方法的方法 ...

  3. 公钥密码之RSA密码算法扩展欧几里德求逆元!!

    扩展欧几里得求逆元 实话说这个算法如果手推的话问题不大,无非就是辗转相除法的逆过程,还有一种就是利用扩展欧几里德算法,学信安数学基础的时候问题不大,但现在几乎都忘了,刷题的时候也是用kuangbin博 ...

  4. HDU-4848 Wow! Such Conquering! 爆搜+剪枝

    Wow! Such Conquering! 题意:一个n*n的数字格,Txy表示x到y的时间.最后一行n-1个数字代表分别到2-n的最晚时间,自己在1号点,求到达这些点的时间和的最少值,如果没有满足情 ...

  5. Codeforces Round #402 (Div. 2) A+B+C+D

    Codeforces Round #402 (Div. 2) A. Pupils Redistribution 模拟大法好.两个数列分别含有n个数x(1<=x<=5) .现在要求交换一些数 ...

  6. 九度oj 题目1107:搬水果

    题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆.每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和.当然经 ...

  7. 关于安卓浏览器无法识别es6语法

    这几天写代码,在highcharts的代码里用了一些es语法 在PC端及iphone上都能正常运行,在安卓上无法显示 一直不知道什么原因.后来一点点查看才发现是下面的两句es6代码 1: .map(i ...

  8. spring之Annotation

    spring除了提供了@Autowired,还提供了以下几类annotation. 1.@Component, @Repository, @Service, @Controller @Reposito ...

  9. BZOJ 1006 [HNOI2008]神奇的国度==最大势算法

    神奇的国度 K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系等等的存在. ...

  10. 稻草人(bzoj 4237)

    Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...