关于设计模式的文章,后续依次会更新,这里先放个彩蛋。
学习设计模式,一定要有自己的想法并在项目运用起来才能体验到它强大的好处,不然都是自嗨,俺第一次使用这个模式的时候是在做手游的时候,当时在军团战的时候,会出现多达7个状态,并且是依次连续出现,不能跳过。这些是题外话了,下面正式分析这个模式。

状态模式和适用的场景


  • 类中定义了很多条件判断语句来进行不同的切换,并且下一个状态的切换是由上一个状态触发的
  • 不想把具体的状态实现细节,数据结构暴露给调用者。
  • 方便新增新的状态,也即方便扩展

这种说法好似放之四海而皆准,太过朦胧,有点雾里看花。下面使用一个网上下单的例子进行说明。下单的流程图如下:

Created with Raphaël 2.2.0开始搜索商品并下单商家付款核对定单信息发货结束

在操作订单的时候,有一个很明显的特性,就是订单的状态不能随机跳跃,如果从“商品下单之后” 直接跳到 发货状态,那你老板,肯定会杀了你这个程序员来祭天。。。。。

状态模式角色分析


  • 具体的状态类,这个可以上面这个流程图可以看出,在程序的角度,可以把各个状态抽象为一个类,这个类就用来处理这个状态所有的业务
  • 为了使得具体的状态类乱来(乱定义函数接口),需要一个小组长来规范它的 行为(当然具体的行为,这个小组长无权过问,你只要在它规定的范围内干活,就没事 )接口规范类,暂且给它命名为:BaseOrderState
  • 有了小组长之后,还需要一个调度员,它的角色就是告诉小组长,什么时候用什么状态,小组长收到通知之后就需要拿出具体的状态来应对,暂且将这个调度员命名为:StateContext

具体的代码实现


调度员类—状态管理类

public class StateContext {private BaseOrderState state;public void setState(BaseOrderState state){this.state = state;}public void nextState(){this.state.nextState(this);}public void preState(){this.state.preState(this);}public String getCurState(){String curState = this.state.getCurState();System.out.println("27--------------State:"+curState);return this.state.getCurState();}
}

小组长类—具体状态函数接口约束类

/*** Created by liuxiaobing on 13/07/2018.*  所有订单的 基类,订单类,均需要扩展此类*  订单状态为:预订---》 付款---》 核对--》 发货*/public abstract class BaseOrderState {private StateContext context;public abstract void nextState(StateContext context);public abstract void preState(StateContext context);public abstract String getCurState();
}

具体状态类—预订状态

public class BookingState extends BaseOrderState {private static BookingState mState;public static BookingState getInstance(){if(mState == null){mState = new BookingState();}return mState;}/*预订状态下一个状态 付款状态*/@Overridepublic void nextState(StateContext context) {context.setState(PayState.getInstance());}@Overridepublic void preState(StateContext context) {System.out.println("-----回到了订单的初始状态了,没有上一个状态");}@Overridepublic String getCurState() {return BookingState.class.getName();}
}

具体状态类—付款状态

public class PayState extends BaseOrderState {private static PayState mState;public static PayState getInstance(){if(mState == null){mState = new PayState();}return mState;}@Overridepublic void nextState(StateContext context) {context.setState(CheckState.getInstance());}@Overridepublic void preState(StateContext context) {context.setState(BookingState.getInstance());}@Overridepublic String getCurState() {return PayState.class.getName();}
}

具体状态类—核对状态

public class CheckState extends BaseOrderState{private static CheckState mState;public static CheckState getInstance(){if(mState == null){mState = new CheckState();}return mState;}@Overridepublic void nextState(StateContext context) {context.setState(DeliveryState.getInstance());}@Overridepublic void preState(StateContext context) {context.setState(PayState.getInstance());}@Overridepublic String getCurState() {return CheckState.class.getName();}
}

具体状态类—发货状态

public class DeliveryState extends BaseOrderState {private static DeliveryState mState;public static DeliveryState getInstance(){if(mState == null){mState = new DeliveryState();}return mState;}public DeliveryState(){try {throw new Exception("请走单例获取实例模式");} catch (Exception e) {e.printStackTrace();}}@Overridepublic void nextState(StateContext context) {System.out.println("29----------订单流程快要走完了,没有下一个状态");}@Overridepublic void preState(StateContext context) {context.setState(CheckState.getInstance());}@Overridepublic String getCurState() {return DeliveryState.this.getClass().getName();}
}

测试类:

package com.example.liuxiaobing.statemodel;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;import com.example.liuxiaobing.statemodel.state_model2.BookingState;
import com.example.liuxiaobing.statemodel.state_model2.StateContext;
import com.example.liuxiaobing.statemodel.statemodel.BlackState;
import com.example.liuxiaobing.statemodel.statemodel.Context;public class MainActivity extends AppCompatActivity {private StateContext mStateMgr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView(){mStateMgr = new StateContext();mStateMgr.setState(BookingState.getInstance());findViewById(R.id.next_state).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mStateMgr.nextState();}});findViewById(R.id.pre_state).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mStateMgr.preState();}});findViewById(R.id.cur_state).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mStateMgr.getCurState();}});}
}

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.liuxiaobing.statemodel.MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"><Buttonandroid:id="@+id/next_state"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="next_state"/><Buttonandroid:id="@+id/pre_state"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="pre_state"/><Buttonandroid:id="@+id/cur_state"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="cur_state"/></LinearLayout></android.support.constraint.ConstraintLayout>

测试ui:

JAVA--状态模式相关推荐

  1. java状态模式和策略模式_Java状态和策略设计模式之间的差异

    java状态模式和策略模式 为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设 ...

  2. java状态模式例子答案_[转载]java设计模式_状态模式(带例子)

    状态模式(STATE) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编 ...

  3. java 状态模式 同步_JAVA设计模式之状态模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...

  4. java状态模式所有情况_轻松掌握Java状态模式

    定义:在状态模式(State Pattern)中,类的行为是基于它的状态改变的. 特点: 1.封装了转换规则. 2.枚举可能的状态,在枚举状态之前需要确定状态种类. 3.将所有与某个状态有关的行为放到 ...

  5. java 状态模式 重试_java状态模式

    一:状态模式 描述: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对 ...

  6. Java状态模式实现工作流_关于使用“状态模式”做工作流概要。

    usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceWF {//工程名称:通过工作流状态进行工作流管理///Au ...

  7. 颜值10分姐姐带我玩转java设计模式(内附照片)- 状态模式

    先不说话,直接来张姐姐照片,称呼上官姐姐即可,希望上官姐姐能带飞 原创不易,麻烦先三连,再细看,谢谢 示例的源码可以直接通过csdn下载也可以通过git导出:https://github.com/ig ...

  8. Java状态和策略设计模式之间的差异

    为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设计原则,从SOLID设计原则 ...

  9. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  10. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

最新文章

  1. 9月8日凌晨,字节跳动全员收到邮件!因为这件事,所有人多发半个月工资!字节沸腾!网友酸了!...
  2. 2017-11-3—grow up
  3. fastdfs 测试客户端_Nginx+FastDFS+MacOS图片服务器的搭建
  4. c++ vector 一部分_C++ vector 使用注意事项
  5. CentOS查看 占用 内存 最多的 进程
  6. 《剑指offer》数组中只出现一次的数字
  7. 关于module require的学习
  8. 自定义常用input表单元素二:纯css实现自定义radio单选按钮
  9. 云计算与分布式系统课程学习笔记(二)——Linux基本命令的使用与熟悉
  10. (需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
  11. 信息学奥赛一本通(1102:与指定数字相同的数的个数)
  12. idea中出现Please, configure Web Facet first问题
  13. css实现垂直居中(+水平居中)
  14. 使用bat脚本自动打开cmd并执行命令
  15. 口算系统c语言,一二年级口算题出题系统
  16. EtherCAT运动控制卡的电子凸轮追剪飞剪等应用(一)
  17. mysql ipv6 字段_MySQL中ipv6地址用什么类型存储?
  18. Mysql的数据类型bit 导出数据展示为SOH
  19. 经营管理、策略经营类社区网页小游戏推荐
  20. 高质量网站哪里找?4个PPT自学网站告别高额培训费,看完受益一生

热门文章

  1. lync2013之边缘服务器的部署
  2. arcgis制作地图册
  3. 【Vue】仿小米商城系统(一)
  4. APM飞控学习之路:1 无人机的分类与发展
  5. 谷歌电子市场学习笔记第四天
  6. 物联网智慧农业的方案介绍(一)【方案篇01】
  7. 三星 android截屏快捷键,三星C5怎么截图/截屏 三星C5截图快捷键与手掌截屏方法...
  8. MVS_Tutorial-1
  9. OpenWRT AR9331 mjpg-streamer 网络安装和离线ipk安装
  10. 微信小程序开发工具初次使用Git 记录一下