状态模式(status Pattern)

      定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States)。与命令模式称为兄弟模式。

简单来说,状态模式就是通过对象的状态来改变其行为,博主凭借模糊的记忆,简单还原一下许久之前看过的《大话设计模式》一书中的例子(这本书中的demo特别精致,推荐一读):

     类图:老毛病,以后画(美名曰日后复习)

  代码:

1、状态的接口所有状态接口继承此类:

package com.pat.status;
/**
* 状态接口
* @author ZX
*/
public interface Status {
public void writeProgram(Work work);
}

2、状态实现类,这里定义了上午中午下午三个子状态:

package com.pat.status;
/**
* 状态1,上午的状态
* @author Administrator
*
*/
public class MorningStatus implements Status{ @Override
public void writeProgram(Work work) {
if(work==null) {return;}
if(work.getHour()<=12) {//小于12点
System.out.println("当前"+work.getHour()+"点,做上午工作");
}else {//大于12点进入中午的状态
work.setCurrerntStatus(new NoonStatus());
work.doWork(); } } }
package com.pat.status;
/**
* 状态2:中午的状态
* @author Administrator
*
*/
public class NoonStatus implements Status{ @Override
public void writeProgram(Work work) {
if(work==null) {return;}
if(work.getHour()<=13) {//小于1点
System.out.println("当前"+work.getHour()+"点,休息");
}else {//大于1点进入中午的状态
work.setCurrerntStatus(new AfternoonStatus());
work.doWork(); } } }
package com.pat.status;
/**
* 状态3:下午的状态
* @author Administrator
*
*/
public class AfternoonStatus implements Status{ @Override
public void writeProgram(Work work) {
if(work==null) {return;}
if(work.getHour()<=18) {//小于18点
System.out.println("当前"+work.getHour()+"点,下午工作");
}else {//大于18点进入中午的状态
System.out.println("干毛线,下班了还干"); } }
}

3、工作类:

package com.pat.status;
/**
* 工作类
* @author ZX
*
*/
public class Work {
private int hour;
private boolean isFinshed;
private Status currerntStatus; //constructor
public Work() {
//设置初始状态-早上的状态
this.currerntStatus= new MorningStatus();
}
public void doWork() {
currerntStatus.writeProgram(this);
} public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public boolean isFinshed() {
return isFinshed;
}
public void setFinshed(boolean isFinshed) {
this.isFinshed = isFinshed;
}
public Status getCurrerntStatus() {
return currerntStatus;
}
public void setCurrerntStatus(Status currerntStatus) {
this.currerntStatus = currerntStatus;
} }

4、测试:

package com.pat.status;

public class Test {
public static void main(String[] args) {
Work work = new Work();
//当前9点
work.setHour(9);
work.doWork();
//当前13点
work.setHour(13);
work.doWork();
work.setHour(16);
work.doWork();
work.setHour(20);
work.doWork();
}
}






【设计模式】行为型08状态模式(status Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  2. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  3. 设计模式(java)--状态模式

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

  4. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  5. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  6. C#设计模式之十九状态模式(State Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...

  7. C#设计模式之十八状态模式(State Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...

  8. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  9. 设计模式21:State 状态模式(行为型模式)

    State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...

随机推荐

  1. OpenMP编程的任务调度控制

    在OpenMP的for任务分担中,各个线程的任务划分是可以由程序员控制调整的.考虑这样一种情况,当在一个循环中每次迭代的计算量不相等时,如果根据系统默认简单的给每个线程分配相同次数的迭代量的话,会导致 ...

  2. Matlab Tricks(十八)—— 矩阵间元素距离的计算

    两个矩阵间元素(向量)距离的度量,首先想到的是遍历,循环的方式,显然 matlab 下的编程并不推荐,matlab 下矩阵向量化编程效率尤高. 先考虑两个向量距离的计算: ∥x−y∥2=∥x∥2+∥y ...

  3. Windows下静态编译Qt4

    既然是静态编译,那就要编译出来的程序不信赖于任何dll文件.首先下载qt-win-opensource-4.7.4-mingw.exe: http://get.qt.nokia.com/qt/sour ...

  4. 简明Python3教程 7.运算符和表达式

    简介 你写的大多数逻辑行都包含表达式.表达式的一个简单例子是2 + 3.一个表达式可分为操作符和操作数两部分. 操作符的功能是执行一项任务:操作符可由一个符号或关键字代表,如+ .操作符需要数据以供执 ...

  5. WPF中的 Layout To Layout

    原文:WPF中的 Layout To Layout   WPF中的 Layout To Layout                             周银辉 WPF的布局功能异常强大,当有时我 ...

  6. Android Training - 使用IntentService运行任务(Lesson 1 - 创建IntentService)

    写在http://hukai.me/blog/android-training-18-running-background-service-lesson-1/ 版权声明:本文博客原创文章,博客,未经同 ...

  7. AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享

    原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...

  8. Linux下C语言RPC(远程过程调用)编程实例

    在查看libc6-dev软件包提供的工具(用 dpkg -L libc6-dev 命令)的时候,发现此软件包提供了一个有用的工具rpcgen命令.通过rpcgen的man手册看到此工具的作用是把RPC ...

  9. SQL Server 2008收缩日志文件--dbcc shrinkfile参数说明

    原文:SQL Server 2008收缩日志文件--dbcc shrinkfile参数说明 DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKF ...

  10. CopyMemory、FillMemory、MoveMemory、ZeroMemory

    CopyMemory 复制内存,第一个参数为目的地址,第二个参数为源地址,第三个参数为复制数据的大小,单位字节,源内存区域不能重叠,如果重叠,可以使用MoveMemory()函数.函数原型如下: vo ...