<十二>读<<大话设计模式>>之状态模式
对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化。在程序设计方面可能要比其它模式略微复杂点,请待我慢慢将来。
本人喜欢用代码来形象的讲述原理,可能是由于对单纯的看些理论的书有些反感或者无趣吧。我希望以后的教育也如此,要不大家都不高考了。
。
。嘿嘿说多了
状态模式:当一个对象的内在状态改变时同意改变其行为。这个对象看起来像是改变了其类。
还是代码呈现吧。概念太抽象了。
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 ...
随机推荐
- 【java 基础 9】原来我从没有了解过String类
导读:这两天没有做项目,然后就想着把之前在项目中用到过的东西总结总结.记得之前做今日开讲项目时,在比较学生学号的时候,我最开始用的是"==",但是,实践证明,这个玩意儿吧,总是很奇 ...
- RESTful API接口
我所理解的RESTful Web API [设计篇] 百度:RESTful restful一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件 ...
- NYOJ-78 圈水池,凸包裸模板!
圈水池 时间限制:3000 ms | 内存限制:65535 KB 难度:4 刚做完HDU1392,就看到这个题,嗯,原代码改改就过了. 题意不多说了,会凸包的话很简单,不会也不难,这道题时限是4s ...
- 常州模拟赛d5t1 journalist
分析:出题人丧心病狂卡spfa......只能用dijkstar+堆优化. 主要的难点是字典序的处理上,一个想法是在做最短路的时候处理,边松弛边记录,比个大小记录最佳答案.具体的思路大概和最短路计数差 ...
- P1410 子序列 (动态规划)
题目描述 给定一个长度为N(N为偶数)的序列,问能否将其划分为两个长度为N/2的严格递增子序列. 输入输出格式 输入格式: 若干行,每行表示一组数据.对于每组数据,首先输入一个整数N,表示序列的长度. ...
- 【边双连通】poj 3352 Road Construction
http://poj.org/problem?id=3352 [题意] 给定一个连通的无向图,求最少加多少条边使得这个图变成边双连通图 [AC] //#include<bits/stdc++.h ...
- mock数据。根据表中一天的数据模拟其他日期的数据
package test; import java.sql.*; import java.text.SimpleDateFormat; import java.util.*; import java. ...
- uva 1426 离散平方根
1426 - Discrete Square Roots Time limit: 3.000 seconds A square root of a number x <tex2html_verb ...
- EC++学习笔记(六) 继承和面向对象设计
条款32:确定你的 public 继承塑模出 is-a 关系 public inheritance 意味着 is-a 关系class Derived 以 public 形式继承 class Base, ...
- 页面中用Context.Handler传递
最近被WCF弄得身心疲惫.今天抽空看了一下页面传值的一些技巧.传统的cookie session 什么的就不介绍了 今天介绍Context的用法 首先要应用using System.Runtim ...