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

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

。嘿嘿说多了

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

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

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. pytorch将cpu训练好的模型参数load到gpu上,或者gpu->cpu上

    假设我们只保存了模型的参数(model.state_dict())到文件名为modelparameters.pth, model = Net() 1. cpu -> cpu或者gpu -> ...

  2. python linux安装anaconda

    步骤: 1.在清华大学镜像站中下载anaconda版本:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ https://mirrors.t ...

  3. 划分树C++版百度百科模板

    此代码同hdu2665改编#include <iostream> #include <cstdio> #include<cstring> #include < ...

  4. MySQL主从复制报错一致性问题解决

    当MySQL主从复制中因为不一致报错的情况,我们第一时间想到的就是使用pt-table-checksum来进行检查主从一致并进行修复,但是使用此工具的前提是主从复制线程都为on状态, 所以这种情况下可 ...

  5. POJ 2396 Budget ——有上下界的网络流

    给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...

  6. BZOJ2457 [BeiJing2011]双端队列 【贪心】

    题目 Sherry现在碰到了一个棘手的问题,有N个整数需要排序. Sherry手头能用的工具就是若干个双端队列. 她需要依次处理这N个数,对于每个数,Sherry能做以下两件事: 1.新建一个双端队列 ...

  7. Spring Boot SpringSecurity5 身份验证

    对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache Shiro.Spring Security). pom.xm ...

  8. 跳蚤 BZOJ 4310

    跳蚤 [问题描述] 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最 ...

  9. 标准C程序设计七---12

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  10. Jenkins使用Publish Over FTP Plugin插件上传FTP详解

    一.安装插件[Publish Over FTP] 二.在[系统管理]->[系统设置]->[Publish over FTP]->点击[增加]按钮,增加一个要连接的FTP: FTP S ...