<十二>读<<大话设计模式>>之状态模式

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

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

。嘿嘿说多了

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

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

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

/**

* @author jzhf

*2014-11-06

*/

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();

}

}

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

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

时间: 2024-10-10 11:13:33

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

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

又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.client依赖两个类.耦合性高:2.假设算法过多则须要写非常多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族.分别封装起来.让它们之间能够互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单位价格*打

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

代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种代理以控制对这个对象的訪问. 在某些情况下,一个对象不适合或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用. 在<<大话设计模式>>一书中以一个有男朋友的女孩让"小菜"帮忙修电脑的故事展开的,事实上说白了代理就是帮别人干活的,一

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

怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错,此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口,让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行比较吧 1.操作接口,与简单工厂模式一样 publicabstractclass Operation { publicdoublenumberA; publicdoublenumberB; publicabstractdouble getResult(); } 2.相加.相减类与简单工厂模式一样 p

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

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

前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种--抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看<大话设计模式C++版--工厂方法模式>. 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生. 一个简单的例

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

工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版--简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放-封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例. 1.保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_

大话设计模式读书笔记2——策略模式

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合. UML 图: 根据<大话设计模式>——第二章 商场促销这个案例代码来简单的记录一下策略模式的使用方式: /// <summary> /// 现金收费抽象类 /// </summary> public abstract class CashSuper { /// <summary> ///

&lt;三&gt;读《《大话设计模式》》之装饰模式

学习这个模式比前几个要难点了,搞了半天才弄懂.好吧,也许是我脑子慢 装饰者模式:装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. <<大话设计模式>>一书中以"小菜"去约会需要打扮为例子来展开学习装饰模式的,对于该模式,本人的理解是:就是对一个已有的算法进行二次加工,但又不改变原来的代码,在原有的数据处理中再一次进行处理. 好了不多说,通过代码去理解会更好一点,本人代码中的注解很关键

大话设计模式-第一章-简单工厂模式

一.UML图 二.包含的角色 简单工厂模式包含三个角色:(1)工厂类Factory(2)抽象产品类AbstractProduct(3)具体产品类ConcreteProduct. (1)Factory:工厂类是用来制造产品的.因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数.这个函数能够根据"标识符"的不同生成不同的ConcreteProduct,当然这些ConcreteProduct都是继承自AbstractProduct的. (2)Abs