state定义 
    不同的状态,不同的行为;或者说,每个状态有着相应的行为. 
    
    就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一个是关闭,关闭的下一个是一档。那么在实际应用中,我们可能会这样做: 
     在上一档的方法中:

Java代码  
  1. if(level == 5){
  2. level = 4;
  3. do something();
  4. }else if(level == 4){
  5. level = 3;
  6. do something();
  7. } else if (level == 3){
  8. level == 2;
  9. do something();
  10. }

在下一档的方法中:

Java代码  
  1. if(level == 1){
  2. level = 2;
  3. do something();
  4. }else if(level == 2){
  5. level = 3;
  6. do something();
  7. } else if (level == 3){
  8. level == 4;
  9. do something();
  10. }

单一方向的切换还好点,双方向的切换就可以考虑使用state模式了 

     假设现在有一个开关,控制三种颜色的切换,blue,green,red,蓝色下一个绿色,绿色下一个红色,红色下一个是蓝色,也可以倒过来 

代码如下:

Java代码  
  1. package state;
  2. /*
  3. * 状态操作接口,执行上一个下一个的操作,还可以获得当前的状态
  4. * 当然在这可以既执行别的操作,比如开关拨到某个颜色的时候,颜色对应的灯亮
  5. */
  6. public interface State {
  7. public  void last(Context c);
  8. public  void next(Context c);
  9. public  String getState();
  10. }
Java代码  
  1. package state;
  2. /*
  3. * 蓝色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中
  4. * 设置改变后的状态
  5. */
  6. public class BlueState implements State {
  7. public String getState() {
  8. // TODO Auto-generated method stub
  9. return "blue";
  10. }
  11. public void last(Context c) {
  12. c.setState(new GreenState());
  13. }
  14. public void next(Context c) {
  15. c.setState(new RedState());
  16. }
  17. }
Java代码  
  1. package state;
  2. /*
  3. * 绿色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中
  4. * 设置改变后的状态
  5. */
  6. public class GreenState implements State {
  7. public String getState() {
  8. return "green";
  9. }
  10. public void last(Context c) {
  11. c.setState(new RedState());
  12. }
  13. public void next(Context c) {
  14. c.setState(new BlueState());
  15. }
  16. }
Java代码  
  1. package state;
  2. /*
  3. * 红色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中
  4. * 设置改变后的状态
  5. */
  6. public class RedState implements State {
  7. public String getState() {
  8. return "red";
  9. }
  10. public void last(Context c) {
  11. c.setState(new BlueState());
  12. }
  13. public void next(Context c) {
  14. c.setState(new GreenState());
  15. }
Java代码  
  1. package state;
  2. /*
  3. * 状态管理器,设置初始状态,得到当前状态,
  4. * 提供了两个操作,上一个的操作方法中,调用了当前状态的last方法,将状态管理器的状态更新
  5. *                下一个的操作方法中,调用了当前状态的next方法,将状态管理器的状态更新
  6. */
  7. public class Context {
  8. private State state = null;
  9. public State getState() {
  10. return state;
  11. }
  12. public void setState(State state) {
  13. this.state = state;
  14. }
  15. public void push(){
  16. state.last(this);
  17. System.out.println(state.getState());
  18. }
  19. public void pull(){
  20. state.next(this);
  21. System.out.println(state.getState());
  22. }
  23. }
Java代码  
  1. package state;
  2. /*
  3. * 测试类
  4. */
  5. public class Test {
  6. public static void main(String[] args) throws InterruptedException {
  7. /*
  8. * 创建一个状态管理器,设置初始状态为红色,
  9. * 然后就可以执行状态管理器的last或者next方法
  10. */
  11. Context c = new Context();
  12. State redsState = new RedState();
  13. c.setState(redsState);
  14. while (true){
  15. System.out.println("当前状态:"+c.getState().getState());
  16. System.out.print("上一个状态: ");
  17. c.push();
  18. Thread.currentThread().sleep(2000);
  19. }
  20. }
  21. }

 

    缺点也显而易见了,如果状态太多了,对应的状态类也会比较多的。。 

java设计模式-State(状态)模式的更多相关文章

  1. JAVA设计模式--State(状态模式)

    状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要 ...

  2. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  3. java设计模式之状态模式

    状态模式 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 状态模式UML图 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关 ...

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

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

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

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

  6. JAVA设计模式:状态模式

    声明:转载请说明来源:http://www.cnblogs.com/pony1223/p/7518226.html 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户 ...

  7. [C++设计模式] state 状态模式

    <head first 设计模式>中的样例非常不错,想制造一个自己主动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄. 糖果机的当前状态处于当中不同的状态时,它 ...

  8. Java设计模式之状态模式详解

    (本文由言念小文原创,转载请注明出处) 在实际工作中经常遇到某个对象,处于不同的状态有不同行为逻辑.且状态之间可以相互迁移的业务场景,特别是在开发通信协议栈类软件中尤为多见.<设计模式之禅> ...

  9. 曾侯乙编钟引发的遐想之Java设计模式:状态模式

    目录 示例 简单例子 改进代码 状态模式 定义 意图 主要解决问题 何时使用 优缺点 曾侯乙编钟 状态模式-命令模式-策略模式 示例 一个类对外提供了多个行为,同时该类对象有多种状态,不同状态下对外的 ...

  10. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

随机推荐

  1. insert ,update 以及merge 的使用

    本次将用到的几个表,以及字段> emp表 empno, ename,job,mgr,hiredate,sal,comm,deptno > dept表 deptno,dname,loc &g ...

  2. 觉得OpenStack的网络复杂?其实你家里就有同样一个网络

    当你想了解OpenStack的Neutron网络,打开下面这张图的时候,心里一定是崩溃的,看起来这些模块连在一起很复杂,但其实和你家里的网络很像,看不出来?看我来慢慢解析. 其实这个网络的样子更像是我 ...

  3. ajax就收data的参数

    一,变量 "data": ${cityData},//数据(必传) 二,json data:{"state":"Front"},

  4. Dynamics 365 Online-60000 API Limits

    最近,Dynamics 365官方文档有最新的发布,就是从2018.3.19开始,会对API请求的数目有个限制:在连续的5分钟里,一个连接用户,针对一个CRM Organization,API请求数不 ...

  5. 【转载】Apache Spark Jobs 性能调优(一)

    当你开始编写 Apache Spark 代码或者浏览公开的 API 的时候,你会遇到各种各样术语,比如 transformation,action,RDD 等等. 了解到这些是编写 Spark 代码的 ...

  6. 一个TokenUtils程序,亲测可用

    1. Token用途 token是HTTP请求的令牌,通俗一点说是凭证,目的是防止api被随意访问获取信息. 可使用随机数生成,也可以使用用户id.密码或时间之类进行排序或者加密进行声称. token ...

  7. (2)Deep Learning之线性单元和梯度下降

    往期回顾 在上一篇文章中,我们已经学会了编写一个简单的感知器,并用它来实现一个线性分类器.你应该还记得用来训练感知器的『感知器规则』.然而,我们并没有关心这个规则是怎么得到的.本文通过介绍另外一种『感 ...

  8. sqoop2报错

    sqoop:000> create link --cid 4 Creating link for connector with id 4Exception has occurred during ...

  9. 如何解决Reporting Services目录数据库文件存在的问题

    打开MSSQL数据库管理系统的安装目录,例如:C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA,C:\是你 ...

  10. 【2016北京集训测试赛】river

    HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...