<十二>读<<大话设计模式>>之状态模式
对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化。在程序设计方面可能要比其它模式略微复杂点,请待我慢慢将来。
本人喜欢用代码来形象的讲述原理,可能是由于对单纯的看些理论的书有些反感或者无趣吧。我希望以后的教育也如此,要不大家都不高考了。
。
。嘿嘿说多了
状态模式:当一个对象的内在状态改变时同意改变其行为。这个对象看起来像是改变了其类。
还是代码呈现吧。概念太抽象了。
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 ...
随机推荐
- 2017 ACM/ICPC Asia Regional Qingdao Online
Apple Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- input加border-raduis之后再加border有阴影
在border之前加入: background:no-repeat 0 0 scroll #fff;border:none;outline:medium;即可解决
- 【基础操作】FFT / DWT / NTT / FWT 详解
1. 2. 点值表示法 假设两个多项式相乘后得到的多项式 的次数(最高次项的幂数)为 $n$.(这个很好求,两个多项式的最高次项的幂数相加就得到了) 对于每个点,要用 $O(n)$ 的时间 把 $x$ ...
- SLF4J 简单日志门面 介绍和使用
参考:http://singleant.iteye.com/blog/934593 http://liuzidong.iteye.com/blog/776072 介绍: 简单日记门面(s ...
- 【BZOJ3991】寻宝游戏(虚树,DFS序,splay)
题意:求在树中从任意点开始,经过若干个关键点回到原点的最小距离 要求支持在线将某个点设置(取消)为关键点,以及询问答案 n,m<=100000 len[i]<=10^9 思路:显然是一个虚 ...
- 再看c语言之getchar/putchar
- GridView动态删除Item
activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...
- C# 编程中的堆栈(Stack)和队列(Queue)
一.什么是堆?(Heap) 堆是无序的,是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收. 是程序运行期 ...
- Codeforces 833B The Bakery(主席树 + 决策单调性优化DP)
题目链接 The Bakery 题目大意:目标是把$n$个数分成$k$组,每个组的值为这个组内不同的数的个数,求$k$个组的值的和的最大值. 题目分析: 这道题我的解法可能和大众解法不太一样……我用主 ...
- webstorm(三):webstorm的一些waring提示
一.Attribute key is not allowed here 二.Comparison this.loginType != 'username' may cause unexpected t ...