【设计模式】行为型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) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
随机推荐
- B 维背包+完全背包 Hdu2159
<span style="color:#3333ff;">/* ---------------------------------------------------- ...
- matlab 矢量化编程(四)—— 标量函数转化为能够处理矢量的函数
1. 组合的矢量实现 nchoosek(n, k) 的第二个参数在 matlab 下是不支持矢量化的,必须是标量形式.但 matlab 下的 gamma 函数,却可支持,矢量形式,又因为,gamma ...
- android延时处理任务范例
今天要做一个任务,要求图片做button开关,点击出发对应事件.点击打开,图片左边显示几行字体,这几行字体是延时显示的.以下将主要代码附上.以下是main.xml <?xml version=& ...
- ubuntu如何修改terminal终端的主机名(修改/etc/hostname文件)
有时候安装完Ubuntu系统后,打开命令终端,终端显示的主机名格式比较难看,例如 我最近买的国内某云的VPS. xxx@VM-1560-ubuntu$ xxx@VM-1560-ubuntu$ 对于有洁 ...
- blockchain_eth客户端安装 & geth使用 &批量转账(一)
这里是第一篇,主要讲eth客户端安装 eth官网 https://ethereum.org/ 国内有一个论坛内容挺多的,可以参考 http://ethfans.org/ eth客户端: eth客户端 ...
- SQL Server查询当前连接数
行数就是连接数,每一行是连接详情 SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [M ...
- delphi2009(10,xe)下indy10发送utf8字符串
最近实现一个功能,使用delphi2009以TCP调用Java端的接口,接口要求先发送字符串的长度,然后再发送字符串内容,并且字符串要求是utf8格式的 调试了好长时间,才终于发现解决办法,或者说发现 ...
- Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果
原文:Win8 Metro(C#)数字图像处理--2.46图像RGB分量增强效果 [函数名称] RGB分量调整 RGBAdjustProcess(WriteableBitmap ...
- SMC状态机笔记
%class 状态机所作用的类 %package 类所在的包 %fsmclass 生成类的类名 %fsmfile 生成类的文件名 %access 生成类的可访问级别 %start 指定状态机的开始状态 ...
- Android手机导出文件
因为要写联系人相关的东西,所以得把db导出来看看 第一步:Root手机 尝试了几个Root工具,发现就KingRoot能root 第二个:编写bat脚本 脚本内容是先将DB文件从/data/data ...