<十二>读<<大话设计模式>>之状态模式
对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化。在程序设计方面可能要比其它模式略微复杂点,请待我慢慢将来。
本人喜欢用代码来形象的讲述原理,可能是由于对单纯的看些理论的书有些反感或者无趣吧。我希望以后的教育也如此,要不大家都不高考了。
。
。嘿嘿说多了
状态模式:当一个对象的内在状态改变时同意改变其行为。这个对象看起来像是改变了其类。
还是代码呈现吧。概念太抽象了。
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();
}
}
通过代码讲述一个故事,对状态模式有了非常形象的诠释,我想不用解释也能理解状态模式是什么了,就是一个过程的某个点的状态,而且该状态是由顺序的。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的推断逻辑转移到表示不同状态的一系列类其中。能够把复杂的推断逻辑简化。
总结:状态模式就是将与特定状态相关的行为局部化,而且将不同状态的行为切割开来,说白了目的就是为了消除庞大的条件分支语句。
<十二>读<<大话设计模式>>之状态模式的更多相关文章
- <二>读<<大话设计模式>>之策略模式
又和大家见面了.可以坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了.哪家商场收银软件强,开玩笑了. 读过上篇文章 ...
- <四>读<<大话设计模式>>之代理模式
代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种 ...
- <五>读《《大话设计模式》》之工厂模式
怎么又是工厂模式呢?上次不是讲过简单工厂模式吗?不错.此工厂模式非彼工厂模式. 工厂模式:定义一个用于创建对象的接口.让子类决定实例化那一个类,工厂方法是一个类的实例化延迟到其子类. 还是以代码来进行 ...
- 《大话设计模式》c++实现 状态模式
状态模式包含如下角色: Context: 环境类 State: 抽象状态类 ConcreteState: 具体状态类 2)适用场景: a)状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂 ...
- 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Facto ...
- 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览<大话设计模式C++版——简单工厂模式>.在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主 ...
- <十一>读<<大话设计模式>>之抽象工厂模式
学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难.就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便.抽象工厂模式名字听起来抽象.但理解起来一点也不抽象,用语言 ...
- <一>读<<大话设计模式>>之简单工厂模式
工厂模式尽管简单.可是写下这篇文章却不简单. 第一:本人经过内心的挣扎后才决定開始写博文的.为什么呢,由于好长时间没有写了,对自己的文学功底也是好不自信.可是技术这东西你不写出来你真不知道自己掌握多少 ...
- 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class I ...
随机推荐
- WordPress 多语言支持(本地化)
本博客将介绍WordPress的多语言制作 首先需要在wp-content目录下创建一个languages文件夹,用于存放语言包文件. 然后在模板目录下的functions.php,然后在代码中添加函 ...
- TOJ 4804: 树网的核
这个是NOIP的提高组的题 4804: 树网的核 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Sub ...
- oracle客户端安装与配置
在进行开发时经常需要连接Oracle数据库,一般的场景是Oracle数据库在远程服务器上,本地计算机通过plsql developer来访问. 这就要求在本地安装好plsql developer,但是 ...
- haskell 乱搞(2)之 Y-conbinator [原创]
Y-conbinator"有没有用"?并没有,在大多数支持函数式编程的语言里,你可以自由的使用递归,而这货只是作为理论基石弥散在函数式编程的血肉之中 这是数学笔记,这是数学笔记,这 ...
- 【DFS序+树状数组】BNUOJ 52733 Random Numbers
http://acm.bnu.edu.cn/v3/problem_show.php?pid=52733 [题意] 给定一棵树,这棵树每个点都有一个点权,标号从0开始,0是根结点 修改操作: SEED ...
- android开发里跳过的坑——TimePickerDialog onTimeSet不回调
在android6.0.1上测试发现TimePickerDialog的onTimeSet和DatePickerDialog的onDateSet不回调,查看SDK源码发现,TimePickerDialo ...
- 2017 ACM/ICPC Asia Regional Guangxi Online 记录
题目链接 Guangxi 感觉这场比赛完全是读题场啊…… 比赛过程中丢失了一波进度,最后想开题的时候已经来不及了…… Problem A 按题意模拟……按照那个矩阵算就可以了 #include &l ...
- Unity3D 异步加载 在 场景加载 中的使用
异步加载 我们想一想玩过的一些游戏,基本都会有加载界面——因为游戏场景数据较大,所以需要加载一小段时间.那为什么一些2D游戏也会有加载界面呢?按理说2D游戏场景会很小,这样做是为了让游戏跑在低端设备上 ...
- HttpClient配置
ClientConfiguration.java 该类讲解了HttpClient的各方面的配置 package com.ydd.study.hello.httpclient; import java. ...
- BZOJ——1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
http://www.lydsy.com/JudgeOnline/problem.php?id=1607 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2 ...