【设计模式】行为型08状态模式(status Pattern)
状态模式(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)的更多相关文章
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式(java)--状态模式
状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...
- 状态模式-State Pattern(Java实现)
状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- C#设计模式之十九状态模式(State Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...
- C#设计模式之十八状态模式(State Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象.有对象当然就 ...
- 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)
说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...
- 设计模式21:State 状态模式(行为型模式)
State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
随机推荐
- OpenMP编程的任务调度控制
在OpenMP的for任务分担中,各个线程的任务划分是可以由程序员控制调整的.考虑这样一种情况,当在一个循环中每次迭代的计算量不相等时,如果根据系统默认简单的给每个线程分配相同次数的迭代量的话,会导致 ...
- Matlab Tricks(十八)—— 矩阵间元素距离的计算
两个矩阵间元素(向量)距离的度量,首先想到的是遍历,循环的方式,显然 matlab 下的编程并不推荐,matlab 下矩阵向量化编程效率尤高. 先考虑两个向量距离的计算: ∥x−y∥2=∥x∥2+∥y ...
- Windows下静态编译Qt4
既然是静态编译,那就要编译出来的程序不信赖于任何dll文件.首先下载qt-win-opensource-4.7.4-mingw.exe: http://get.qt.nokia.com/qt/sour ...
- 简明Python3教程 7.运算符和表达式
简介 你写的大多数逻辑行都包含表达式.表达式的一个简单例子是2 + 3.一个表达式可分为操作符和操作数两部分. 操作符的功能是执行一项任务:操作符可由一个符号或关键字代表,如+ .操作符需要数据以供执 ...
- WPF中的 Layout To Layout
原文:WPF中的 Layout To Layout WPF中的 Layout To Layout 周银辉 WPF的布局功能异常强大,当有时我 ...
- Android Training - 使用IntentService运行任务(Lesson 1 - 创建IntentService)
写在http://hukai.me/blog/android-training-18-running-background-service-lesson-1/ 版权声明:本文博客原创文章,博客,未经同 ...
- AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享
原文:AY写给国人的教程- VS2017 Live Unit Testing[2/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...
- Linux下C语言RPC(远程过程调用)编程实例
在查看libc6-dev软件包提供的工具(用 dpkg -L libc6-dev 命令)的时候,发现此软件包提供了一个有用的工具rpcgen命令.通过rpcgen的man手册看到此工具的作用是把RPC ...
- SQL Server 2008收缩日志文件--dbcc shrinkfile参数说明
原文:SQL Server 2008收缩日志文件--dbcc shrinkfile参数说明 DBCC SHRINKFILE 收缩相关数据库的指定数据文件或日志文件大小. 语法 DBCC SHRINKF ...
- CopyMemory、FillMemory、MoveMemory、ZeroMemory
CopyMemory 复制内存,第一个参数为目的地址,第二个参数为源地址,第三个参数为复制数据的大小,单位字节,源内存区域不能重叠,如果重叠,可以使用MoveMemory()函数.函数原型如下: vo ...