关于设计模式的文章,后续依次会更新,这里先放个彩蛋。
学习设计模式,一定要有自己的想法并在项目运用起来才能体验到它强大的好处,不然都是自嗨,俺第一次使用这个模式的时候是在做手游的时候,当时在军团战的时候,会出现多达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. java线程安全的set_Java并发编程之set集合的线程安全类你知道吗
  2. # 利用fragment实现界面跳转
  3. MAX Script 脚本语言
  4. 每天在竞争中淘汰自己
  5. jmeter java接口_JMeter接口Java开发五步曲
  6. 《我们应该怎样做需求分析》阅读笔记
  7. android int 首位值_Android应用视图的管理者Window
  8. JS前端常用工具方法
  9. LeetCode 326. Power of Three
  10. ruby map, reduce, select, reject, group_by
  11. springmvc错点集结
  12. Spring Cloud-honghu Cloud分布式微服务云系统--云架构代码结构构建
  13. setAttribute在设置属性 ieBug
  14. ROS配置环境搞错了,每次开终端都有bash: export: `/home/yyq/ork_ws/devel/setup.bash‘: 不是有效的标识符
  15. 《深入浅出WPF》学习笔记之一
  16. 仿射变换再次秒杀2011山东理科高考压轴题(圆锥曲线)
  17. 小心了,京东订单详情会变?下单记得录屏
  18. java ajax传递到action_day8——ajax传参到action(Struts2)
  19. 2022危险化学品经营单位主要负责人操作证考试题及模拟考试
  20. TCGA临床数据整理

热门文章

  1. Windows批处理 cmd/bat 常用命令教程
  2. IRIS 2021 技术文档 First Look 29 技术概要:LDAP 和 InterSystems 产品
  3. Node之父重构的Deno终于发布了,它终究会取代Node吗?
  4. JS运算符% 和 /
  5. java助教面试自我介绍,助教面试自我介绍
  6. golang 分析调试高阶技巧
  7. yolov4环境配置遇到的问题
  8. 用随机投点法计算pi值matlab,(原创精品)用随机投点法计算π值【Compute π with dartpoint randomly】.doc...
  9. python编程第一程序_第一个Python程序_Python编程开发教程
  10. Portraiture全新4.0最新版人像磨皮插件更新内容