状态模式(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. Uniform synchronization between multiple kernels running on single computer systems

    The present invention allocates resources in a multi-operating system computing system, thereby avoi ...

  2. 分享一下Oracle 10g和Toad for Oracle的安装步骤

    三年前用过Oracle,单纯的“用过”,主要就是说对数据库的一些操作,还不包含创建一些存储过程之类的,所以对Oracle仅仅只是了解一点儿,因为当时那家公司里面,数据库里面的东西都是那些顾问负责的,再 ...

  3. 标准差standard deviation和标准错误standard error你能解释一下

    by:ysuncn(欢迎转载,请注明原创信息) 什么是标准差(standard deviation)呢?依据国际标准化组织(ISO)的定义:标准差σ是方差σ2的正平方根:而方差是随机变量期望的二次偏差 ...

  4. malloc()与calloc差异

    Both the malloc() and the calloc() functions are used to allocate dynamic memory. Each operates slig ...

  5. QT实现鼠标钩子(使用SetWindowsHookEx安装mouseProc函数)

    HHOOK mouseHook=NULL; LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam ) { if(nCode ...

  6. js 动态生成button 并设置click事件

    <div id="MyDiv"></div> <script> function AddButton() { var MyDiv =docume ...

  7. Android adb shell 无法启动:insufficient permissions for device

    解决办法1:lsusb查看vendorId号,然后在/etc/udev/rules.d/目录下增加(或修改)51-android.rules文件.增加一条记录:SUBSYSTEM=="usb ...

  8. html send mail

    <html> <body> <script> var formattedBody = "FirstLine \n Second Line \n Third ...

  9. sql语句查询重复值

    select * from user where name in (select name from user group by name having count(*)>1)

  10. 『SHELL』--SHELL脚本执行方式(转)

    Shell脚本的执行方式: 注明:wd代表“脚本保存的目录” 1.fork 语法:/wd/shell.sh fork是最普通的, 就是直接在脚本里面用/wd/shell.sh来调用shell.sh这个 ...