【设计模式】行为型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) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
随机推荐
- 移动浏览器Chrome 32 for Android移除300ms点击推迟
在手机浏览器的一篇文章翻译300ms延迟实用文章,原文地址 http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away 去掉移动设 ...
- WPF loading加载动画库
原文:WPF loading加载动画库 1. 下载Dll https://pan.baidu.com/s/1wKgv5_Q8phWo5CrXWlB9dA 2.在项目中添加引用 ...
- [科普]MinGW vs MinGW-W64及其它(比较有意思,来自mingw吧)
部分参照备忘录原文: bitbucket.org/FrankHB/yslib/src/50c3e6344a5a24b2382ce3398065f2197c2bd57e/doc/Workflow.Ann ...
- android自定义View绘制天气温度曲线
原文:android自定义View绘制天气温度曲线 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012942410/article/detail ...
- the solution about "messy code" in elicpse
I use the Elicpse IDE to develope the ansdroid app.Sometime encounter the messy code in the Elicpse ...
- 多线程——继承Thread类别
详细java此前使用多线程,让我们来看看下面的问题. 什么是多线程 简单的理解成:cpu"同一时候"运行多个任务,这就是多线程. (究其本质,当涉及到进程和线程的概念.上面 ...
- Windows PowerShell 集成脚本环境 (ISE)
应用场景 有时会遇到一些这样的报错 Exception calling "SetData" with "2" argument(s): "Type ' ...
- C#破解access数据库密码方法
原文:C#破解access数据库密码方法 using System; using System.Collections.Generic; using System.IO; using System.L ...
- android adb socket 通信
今天遇到一个问题:pc客户端和android的App通信,心跳通道(心跳包27个字节,是一个业务空包)在部分pc上总是会超时(5秒超时),nagle算法也给禁用了,pc端时按按量发送心跳的,怀疑来怀疑 ...
- 关于powerdesigner中的data types说明
原文:关于powerdesigner中的data types说明 这一堆的数据类型看着真是头大,弄个表格对照一下. Numeric data types Standard datatype DBMS- ...