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

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

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

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

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

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、客户端

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-09-30 05:52:32

<十二>读<<大话设计模式>>之状态模式的相关文章

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

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

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla

大话设计模式之----状态模式

<?php    #状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类.    //抽象状态    abstract class State{        public $w;        abstract function WriteProgram($w);    }        //上午和中午工作状态类    class ForenoonState extends State{        function WriteProgram($w){     

&lt;九&gt;读&lt;&lt;大话设计模式&gt;&gt;之建造者模式

学习了这么多模式,其实回想一下其实也没什么,就是用不同的方式设计代码,保证代码的可扩展性.复用等,稍微对代码进行一下修改就是另外一种模式.在我们工作中其实已经用了很多模式了,只不过不知道或者没留意他叫什么而已,无所谓,只要会用一切都是浮云. 关于<<大话设计模式>>对建造者模式的讲解是以画一个人来作为例子讲解的.人分为高人.矮人.胖人.瘦人等,但都是人,但当你去画一个人的时候,画的过程都是稳定的,都需要画头.身子.手.脚,不同的是建造的细节是不一样的.所以如果你需要将一个复杂的构件

&lt;六&gt;读&lt;&lt;大话设计模式&gt;&gt;之原型模式

原型模式也是很简单的一种模式,对于java来说已经有相应的接口了(Cloneable).关于原型模式<<大话设计模式>>是以投放简历作为例子讲解的,即我要投放很多简历,其实每个简历都一样,所以只要我写好一份,其他的复制就行了,其实就是今天讲的原型模式,就是把要复制的类对象的属性复制到另外一个对象上(其实不是复制而是对象的引用改变). 原型模型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 浅复制VS深复制 关于克隆有两个概念 浅复制:就是只复制值类型的字段,不能

&lt;八&gt;读&lt;&lt;大话设计模式&gt;&gt;之外观模式

外观模式其实很好理解的,就是将表面的东西展示给人看,内部的东西你不知道的(因为已经封装好了),比如一个外部系统要和公司内部5个系统进行交互,而这5个系统之间也有交互,那么第一种就是外部系统和5个系统都进行交互:第二种就是做一个接口将外部系统需要的逻辑封装成一个方法,该方法中包含了关于5个系统的交互方式,这样外部系统就不用直接和5个系统交互了,直接调用接口完事.外观模式也叫门面模式,其实说白了就是把要用的东西封装起来使交互更加方便. 外观模式定义:为子系统中的一组接口提供一个一致的界面,此模式定义

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

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

二十三种设计模式[20] - 状态模式(State Pattern)

前言 状态模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类 ". 场景 我们都坐过火车,火车可以简单的分为" 开门 "," 关门 "," 运行 "," 停止 "四个状态.火车在这四个状态下分别可以做不同的事情.比如只有在关门时才行运行.只有在停止时才能开门. 我们在开发类似的业务时,往

笔记-大话设计模式-16 状态模式

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 消除庞大的条件分支语句.状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了. Demo1: abstract class