JAVA--状态模式
关于设计模式的文章,后续依次会更新,这里先放个彩蛋。
学习设计模式,一定要有自己的想法并在项目运用起来才能体验到它强大的好处,不然都是自嗨,俺第一次使用这个模式的时候是在做手游的时候,当时在军团战的时候,会出现多达7个状态,并且是依次连续出现,不能跳过。这些是题外话了,下面正式分析这个模式。
状态模式和适用的场景
- 类中定义了很多条件判断语句来进行不同的切换,并且下一个状态的切换是由上一个状态触发的
- 不想把具体的状态实现细节,数据结构暴露给调用者。
- 方便新增新的状态,也即方便扩展
这种说法好似放之四海而皆准,太过朦胧,有点雾里看花。下面使用一个网上下单的例子进行说明。下单的流程图如下:
在操作订单的时候,有一个很明显的特性,就是订单的状态不能随机跳跃,如果从“商品下单之后” 直接跳到 发货状态,那你老板,肯定会杀了你这个程序员来祭天。。。。。
状态模式角色分析
- 具体的状态类,这个可以上面这个流程图可以看出,在程序的角度,可以把各个状态抽象为一个类,这个类就用来处理这个状态所有的业务
- 为了使得具体的状态类乱来(乱定义函数接口),需要一个小组长来规范它的 行为(当然具体的行为,这个小组长无权过问,你只要在它规定的范围内干活,就没事 )接口规范类,暂且给它命名为: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--状态模式相关推荐
- java状态模式和策略模式_Java状态和策略设计模式之间的差异
java状态模式和策略模式 为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设 ...
- java状态模式例子答案_[转载]java设计模式_状态模式(带例子)
状态模式(STATE) Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编 ...
- java 状态模式 同步_JAVA设计模式之状态模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...
- java状态模式所有情况_轻松掌握Java状态模式
定义:在状态模式(State Pattern)中,类的行为是基于它的状态改变的. 特点: 1.封装了转换规则. 2.枚举可能的状态,在枚举状态之前需要确定状态种类. 3.将所有与某个状态有关的行为放到 ...
- java 状态模式 重试_java状态模式
一:状态模式 描述: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对 ...
- Java状态模式实现工作流_关于使用“状态模式”做工作流概要。
usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceWF {//工程名称:通过工作流状态进行工作流管理///Au ...
- 颜值10分姐姐带我玩转java设计模式(内附照片)- 状态模式
先不说话,直接来张姐姐照片,称呼上官姐姐即可,希望上官姐姐能带飞 原创不易,麻烦先三连,再细看,谢谢 示例的源码可以直接通过csdn下载也可以通过git导出:https://github.com/ig ...
- Java状态和策略设计模式之间的差异
为了在Core Java应用程序中正确使用状态和策略设计模式,对于Java开发人员清楚地了解它们之间的区别很重要. 尽管状态和策略设计模式的结构相似,并且都基于开放式封闭设计原则,从SOLID设计原则 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
最新文章
- 9月8日凌晨,字节跳动全员收到邮件!因为这件事,所有人多发半个月工资!字节沸腾!网友酸了!...
- 2017-11-3—grow up
- fastdfs 测试客户端_Nginx+FastDFS+MacOS图片服务器的搭建
- c++ vector 一部分_C++ vector 使用注意事项
- CentOS查看 占用 内存 最多的 进程
- 《剑指offer》数组中只出现一次的数字
- 关于module require的学习
- 自定义常用input表单元素二:纯css实现自定义radio单选按钮
- 云计算与分布式系统课程学习笔记(二)——Linux基本命令的使用与熟悉
- (需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
- 信息学奥赛一本通(1102:与指定数字相同的数的个数)
- idea中出现Please, configure Web Facet first问题
- css实现垂直居中(+水平居中)
- 使用bat脚本自动打开cmd并执行命令
- 口算系统c语言,一二年级口算题出题系统
- EtherCAT运动控制卡的电子凸轮追剪飞剪等应用(一)
- mysql ipv6 字段_MySQL中ipv6地址用什么类型存储?
- Mysql的数据类型bit 导出数据展示为SOH
- 经营管理、策略经营类社区网页小游戏推荐
- 高质量网站哪里找?4个PPT自学网站告别高额培训费,看完受益一生