<十二>读<<大话设计模式>>之状态模式
对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式事实上就是某一个对象在某个过程或者时间的一个状态记录,可是这个状态的顺序不能发生变化。在程序设计方面可能要比其它模式略微复杂点,请待我慢慢将来。
本人喜欢用代码来形象的讲述原理,可能是由于对单纯的看些理论的书有些反感或者无趣吧。我希望以后的教育也如此,要不大家都不高考了。
。
。嘿嘿说多了
状态模式:当一个对象的内在状态改变时同意改变其行为。这个对象看起来像是改变了其类。
还是代码呈现吧。概念太抽象了。
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 ...
随机推荐
- Leetcode 376.摆动序列
摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
- n&(n-1)的用途
最近做LeetCode上面的题目,发现很多题目都用到了n&(n-1).感觉真是神通广大,下面就目前所看到的一些用途总结一下: 1,求一个int类型数是否为2的幂 当n=4时,二进制为:0100 ...
- [kubernetes] 使用 Minikube 快速搭建本地 k8s 环境 (基于 Docker 驱动模式)
一.实验环境 操作系统:Centos 7 x86_64 Docker:1.12.6 二.部署 k8s 步骤 2.1 安装 kubectl cat <<EOF > /etc/yum. ...
- BZOJ 1027 [JSOI2007]合金 ——计算几何
我们可以把每一种金属拆成一个二维向量,显然第三维可以计算出来,是无关的. 我们只需要考虑前两维的情况,显然可以构成点集所形成的凸包内. 然后我们枚举两两的情况,然后可以发现如果所有的点都在一侧是可以选 ...
- java之线程池面试题
面试官:线程池有哪些?分别的作用是什么? 常用的线程池有: newSingleThreadExecutor newFixedThreadExecutor newCacheThreadExecutor ...
- Vmware error:无法获得 VMCI 驱动程序的版本: 句柄无效。
error:无法获得 VMCI 驱动程序的版本: 句柄无效.驱动程序“vmci.sys”的版本不正确.请尝试重新安装 VMware Workstation.开启模块 DevicePowerOn 的操作 ...
- Nova 组件详解
本节开始,我们将详细讲解 Nova 的各个子服务. 前面架构概览一节知道 Nova 有若干 nova-* 的子服务,下面我们将依次学习最重要的几个.今天先讨论 nova-api 和 nova-cond ...
- javascript事件委托和jQuery事件绑定on、off 和one以及on绑定多个事件(重要)
一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中, ...
- laravel 操作数据库
建立student控制器,控制器代码 namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; class StudentC ...
- 微服务网关实战——Spring Cloud Gateway
导读 作为Netflix Zuul的替代者,Spring Cloud Gateway是一款非常实用的微服务网关,在Spring Cloud微服务架构体系中发挥非常大的作用.本文对Spring Clou ...