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状态设计模式的更多相关文章

  1. 程序设计模式 —— State 状态模式

    我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...

  2. 设计模式---状态变化模式之state状态模式(State)

    前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:Stat ...

  3. 设计模式21:State 状态模式(行为型模式)

    State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...

  4. State模式(状态设计模式)

    State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...

  5. C++设计模式-State状态模式

    State状态模式作用:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. UML图如下: State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为. ...

  6. 设计模式(20)--State(状态模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式 ...

  7. Spark Streaming揭秘 Day14 State状态管理

    Spark Streaming揭秘 Day14 State状态管理 今天让我们进入下SparkStreaming的一个非常好用的功能,也就State相关的操作.State是SparkStreaming ...

  8. Vuex state 状态浅解

    对于Vuex中的state里面的理解总是有些欠缺,机制似乎理解了.但是还有很多的不足,在这就先浅谈下自己的理解. vuex 机制中,定义了全局Store,在各个vue组件面的this.$store指向 ...

  9. State状态模式

    1.简介 在日常开发中,某些对象的状态如果发生改变,对应的行为也将发生改变,那么如何在运行时根据对象的状态动态的改变对象的行为,同时不产生紧耦合关系(即使用if else或者swith所带来的紧耦合关 ...

随机推荐

  1. Linux 配置主机名

    方法 1:临时配置 [root@NING ~]# hostname NING CRT重新连接即可,服务器重启失效. 方法 2:永久配置 步骤1:包含了主机最基本的网络信息,用于系统启动. [root@ ...

  2. MySQL去除外键关联关系

    导数据或者删数据有主外键关联会特别麻烦,可以外键关联,数据处理完再加上. SET FOREIGN_KEY_CHECKS = 0; DELETE FROM frm_userinfo_; SET FORE ...

  3. 从C#到Objective-C

    Objective-C 程序设计语言采用特定的语法,来定义类和方法.调用对象的方法.动态地扩展类,以及创建编程接口,来解决具体问题.Objective-C 作为 C 程序设计语言的超集,支持与 C 相 ...

  4. uv纹理坐标设定与贴图规则

    1.什么是UV?   对于三维模型,有两个最重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个就是UV坐标.什么是UV?简单的说,就是贴图影射到模型表面的依据. 完整的说,其实应该是UVW(因为 ...

  5. [MSSQL]如何高效查询表的总记录数

    如何高效查询表的总记录数?[总结-整理-马克] 首先想到的自然是在表主键上应用COUNT函数来查询了,这个是目前使用最多的方法,没有之一 ) ROWS FROM product 这里再给出一些其它方法 ...

  6. WPF Dispatcher 一次小重构

    几个月之前因为项目需要,需要实现一个类似于WPF Dispatcher类的类,来实现一些线程的调度.之前因为一直做Asp.Net,根本没有钻到这个层次去,做的过程中,诸多不顺,重构了四五次,终于实现, ...

  7. 写给自己看的Linux运维基础(一) - 系统基础

    查看内核版本信息 uname -a 查看发行版本 cat /etc/issue 查看硬件配置 CPU: cat /proc/cpuinfo      more /proc/cpuinfo | grep ...

  8. B-tree&B+tree

    B-tree&B+tree B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的 ...

  9. 理解Certificate、App Id、Identifiers 和 Provisioning Profile

    做真机测试的时候,按照网上的流程,走通了,当时没有注意各种证书等的意思.现在做消息推送,需要各种证书.APP ID信息,为了更好的理解这个过程,所以整理了网上关于证书等的相关资料.方便自己和有需要的朋 ...

  10. MVC5为WebAPI添加命名空间的支持

    前言 默认情况下,微软提供的MVC框架模板中,WebAPI路由是不支持Namespace参数的.这导致一些比较大型的项目,无法把WebApi分离到单独的类库中. 本文将提供解决该问题的方案. 微软官方 ...