State状态设计模式
1、状态模式:改变对象的行为
一个用来改变类的(状态的)对象。
2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法,
比如用到的状态(State)是否要暴露给调用的客户,以及如何使状态发生变化
用于改变状态的机制可能很简单也可能很复杂-比如状态机(State Machine)
3、代理(Proxy)设计模式实际上是状态设计模式的一个特例
4、和策略模式Strategy的区别和联系(本段转载自:http://joe5456536.blog.163.com/blog/static/85374773201192252829941/)
状态模式和策略模式的结构师完全一样的,但它们的目的、实现、本质却完全不一样。
状态模式的行为是平行的,不可相互替换的;
而策略模式的行为是平等性的,是可以相互替换的。
5、类图以及UML(astah/jude)下载地址 :http://pan.baidu.com/s/1kTieTa3

6、示例:
通用状态规范
package com.xinye.test.state;
/**
* 所有的状态都具有的行为规范
* @author xinye
*
*/
public interface IState {
public void operator();
}
第一种状态
package com.xinye.test.state; /**
* 第一种状态
* @author xinye
*
*/
public class FirstState implements IState { @Override
public void operator() {
System.out.println(getClass().getSimpleName() + " operator()");
} }
第二种状态
package com.xinye.test.state; /**
* 第二种状态
* @author xinye
*
*/
public class SecondState implements IState { @Override
public void operator() {
System.out.println(getClass().getSimpleName() + " operator()");
} }
第三种状态
package com.xinye.test.state; /**
* 第三种状态
* @author xinye
*
*/
public class ThirdState implements IState { @Override
public void operator() {
System.out.println(getClass().getSimpleName() + " operator()");
} }
状态模式Context(执行具体的方法的时候,需要传递相应的状态代码,个人感觉最好能定义出来一个Enum来规范)
package com.xinye.test.state;
/**
* 状态上下文
* @author xinye
*
*/
public class Context { private IState state = null;
/**
* 执行操作
* @param _state 哪一种状态
*/
public void exec(int _state){
if(1 == _state){
state = new FirstState();
}else if(2 == _state){
state = new SecondState();
}else{
state = new ThirdState();
}
state.operator();
}
}
客户端代码
package com.xinye.test.state;
/**
* 客户端代码
* @author xinye
*
*/
public class Client {
public static void main(String[] args) {
Context context = new Context(); context.exec(1);
context.exec(2);
context.exec(3);
}
}
执行结果:
FirstState operator()
SecondState operator()
ThirdState operator()
-------------------------------------------------------------------------------------------
另一种Context和Client
package com.xinye.test.state;
/**
* 第二种状态模式的实现
* @author xinye
*
*/
public class Context_2 {
private IState state = new FirstState(); public void exec(){
state.operator();
// 其他代码
// ***
changeState(); }
private void changeState(){
if(state instanceof FirstState){
state = new SecondState();
}else if(state instanceof SecondState){
state = new ThirdState();
}else{
state = new FirstState();
}
}
} package com.xinye.test.state; public class Client_2 {
public static void main(String[] args) {
Context_2 context2 = new Context_2();
context2.exec();
context2.exec();
context2.exec();
context2.exec();
context2.exec();
}
}
执行结果:
FirstState operator()
SecondState operator()
ThirdState operator()
FirstState operator()
SecondState operator()
State状态设计模式的更多相关文章
- 程序设计模式 —— State 状态模式
我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...
- 设计模式---状态变化模式之state状态模式(State)
前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:Stat ...
- 设计模式21:State 状态模式(行为型模式)
State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- C++设计模式-State状态模式
State状态模式作用:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. UML图如下: State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为. ...
- 设计模式(20)--State(状态模式)--行为型
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式 ...
- Spark Streaming揭秘 Day14 State状态管理
Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming ...
- Vuex state 状态浅解
对于Vuex中的state里面的理解总是有些欠缺,机制似乎理解了.但是还有很多的不足,在这就先浅谈下自己的理解. vuex 机制中,定义了全局Store,在各个vue组件面的this.$store指向 ...
- State状态模式
1.简介 在日常开发中,某些对象的状态如果发生改变,对应的行为也将发生改变,那么如何在运行时根据对象的状态动态的改变对象的行为,同时不产生紧耦合关系(即使用if else或者swith所带来的紧耦合关 ...
随机推荐
- 解决IIS Express 80端口被占用的情况
VS2012运行站点的时候提示“无法启动IIS Express Web服务器,端口80正在使用” 于是CMD查看了一下端口使用情况,并且在任务管理器中查看相应的进程,但始终觉得不对,因为显示是Syst ...
- [ACM_水题] 不要62(hdu oj 2089, 不含62和4的数字统计)
Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来, ...
- ROCK 聚类算法
ROCK (RObust Clustering using linKs) 聚类算法是一种鲁棒的用于分类属性的聚类算法.该算法属于凝聚型的层次聚类算法.之所以鲁棒是因为在确认两对象(样本点/簇)之间 ...
- PHP读取大文件的几种方法介绍
读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办 ...
- Cacti学习笔记一:基本安装和配置
1.安装依赖包 yum -y install net-snmp-devel mysql mysql-devel openssl-devel libtool 2.安装RRDTool yum -y ins ...
- C语言实现快速排序
我觉得冒泡排序是比较简单的: 所以今天我们实现一个叫做快速排序的: Problem 你想要将(4,3,5,1,2)排序成(1,2,3,4,5) 你决定使用最简单的快速排序: Solution 首先,打 ...
- atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o
atitit. 浏览器插件 控件 applet 的部署,签名总结 浏览器 插件 控件 的签名安全机制o9o 1. 服务器部署签名 1 2. 签名流程::生成密钥..导出cert正书,签名 1 3. ...
- Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结
Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...
- java集合练习——题目
2.已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚,荷 ...
- javascript实例——时间日期篇(包含5个实例)
本来想在网上找一些js实例来练练手,结果发现一本书<突破JavaScript编程实例五十讲>,看了下内容还不错,就下了下来: 后面又下了该书籍的源码,一看才发现这本书编的日期是2002年的 ...