JAVA设计模式-状态模式-State-订单状态

21. State(状态)
 
 
意图:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
解释:

比如说对订单的提交,第一次提交是成功的,但是第二次提交的时候就会是失败的,因为其内部状态已经改变,而外部都是“订单”调用了“提交”方法,同一个行为,但是实质上造成的效果已经不同。
 
适用性:
一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

解释:

行为取决于它的状态,即是说由状态决定行为,方法放在状态类中,而状态控制亦在状态类中进行,譬如一个按钮,按一次是开,按一次是关,同一个行为,但是由于其状态的改变,而导致不同的结果。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
即是说以前你需要在某个行为的方法里面用if/else或者switch中写的一堆业务,现在可以转移到状态类中了,而该状态类是独立的,非常便于流程管理。譬如之前的开关,你需要在toggle()中写if/else,并且需要返回flag以便判断状态,而使用状态类,将状态分为开/关两种状态,只需要在状态类的toggle()方法中写入逻辑,将行为后的状态返回即可。
 
实现:
需要实现这个逻辑:
那么我们就需要
3个具体状态类(已预订,已确认,已锁定)
以及3个行为(确认,修改,支付)
 
抽象状态类
  1. abstract class OrderState {
  2. abstract void confirm(OrderContext orderContext);
  3. abstract void modify(OrderContext orderContext);
  4. abstract void pay(OrderContext orderContext);
  5. }

具体状态类

  1. class OrderedState extends OrderState {
  2. @Override
  3. void confirm(OrderContext orderContext) {
  4. System.out.println("订单已确认");
  5. orderContext.setState(new ConfirmedState());
  6. }
  7. @Override
  8. void modify(OrderContext orderContext) {
  9. System.out.println("订单已修改");
  10. orderContext.setState(this);
  11. }
  12. @Override
  13. void pay(OrderContext orderContext) {
  14. System.out.println("预定状态无法完成订单!");
  15. }
  16. }
  17. class ConfirmedState extends OrderState {
  18. @Override
  19. void confirm(OrderContext orderContext) {
  20. System.out.println("订单已确认,请勿重复确认");
  21. }
  22. @Override
  23. void modify(OrderContext orderContext) {
  24. System.out.println("订单已修改,请再次确认");
  25. orderContext.setState(new OrderedState());
  26. }
  27. @Override
  28. void pay(OrderContext orderContext) {
  29. System.out.println("订单已支付,无法再修改");
  30. orderContext.setState(new LockedState());
  31. }
  32. }
  33. class LockedState extends OrderState {
  34. @Override
  35. void confirm(OrderContext orderContext) {
  36. System.out.println("订单已锁定");
  37. }
  38. @Override
  39. void modify(OrderContext orderContext) {
  40. System.out.println("订单已锁定");
  41. }
  42. @Override
  43. void pay(OrderContext orderContext) {
  44. System.out.println("订单已锁定");
  45. }
  46. }

背景类

  1. class OrderContext {
  2. OrderState state = null;
  3. //新建订单设为已预定状态
  4. OrderContext() {
  5. this.state = new OrderedState();
  6. }
  7. void setState(OrderState state) {
  8. this.state = state;
  9. }
  10. public void confirm() {
  11. state.confirm(this);
  12. }
  13. public void modify() {
  14. state.modify(this);
  15. }
  16. public void pay() {
  17. state.pay(this);
  18. }
  19. }

测试:

  1. public static void main(String[] args) {
  2. OrderContext orderContext = new OrderContext();
  3. orderContext.confirm();     //已预定状态>已确认状态
  4. orderContext.modify();      //已确认状态>已预定状态
  5. orderContext.confirm();    //已预定状态>已确认状态
  6. orderContext.pay();       //已确认状态>已锁定状态
  7. orderContext.modify();    //已锁定状态
  8. }
  1. 订单已确认
  2. 订单已修改,请再次确认
  3. 订单已确认
  4. 订单已支付,无法再修改
  5. 订单已锁定

状态模式-State-订单状态的更多相关文章

  1. 大熊君说说JS与设计模式之------状态模式State

    一,总体概要 1,笔者浅谈 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...

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

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

  3. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

  4. 设计模式 ( 十七) 状态模式State(对象行为型)

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

  5. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  6. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  7. 北风设计模式课程---状态模式State(对象行为型)

    北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...

  8. 《JAVA设计模式》之状态模式(State)

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

  9. 状态模式(State)-设计模式

    软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...

  10. 【UE4 设计模式】状态模式 State Pattern

    概述 描述 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式. 有限状态机(FSMs) ...

随机推荐

  1. HDU ACM 1856 More is better(并查集)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=1856 [解题思路]给的数据有点大,干脆少开点数组,直接上set存储有朋友的孩子的编号,同时根据编号初 ...

  2. php中编码转换方法

    php里经常用到编码转换,在这记录一个常用的编码转换方法,字符串.数组.对象都可以使用,使用了递归来解决,比较普通 /* * php中编码转换 * @param $param 需要转换的数据 * @p ...

  3. selenium+Python3.5获取验证码

    其中PIL为Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. PIL第三方库安装 pip install PI ...

  4. C# 动态方法和静态方法的区别

    C# 动态方法和静态方法的区别 (转) 动态方法与静态方法的区别: 1,使用方法上的区别:动态方法,在使用时需要先创建实例,才能调用实例方法,而静态方法则不需要,直接使用即可. 示例代码如下:静态方法 ...

  5. Linux下Sublime Text 3的安装

    1.下载 官网下载 或者直接 #wget http://c758482.r82.cf2.rackcdn.com/sublime_text_3_build_3059_x32.tar.bz2 (linux ...

  6. CF 932E Team Work

    原题题面 题目大意:求\(\sum\limits_{i=0}^{n}C_{n}^{i}i^{k}\). 我们根据套路\(n^{k}=\sum\limits_{i=0}^{k}C_{n}^{i}i!S_ ...

  7. luogu P4146 序列终结者

    嘟嘟嘟 这是一道splay基础题. 最坑的一点是,因为有些节点可能没有左儿子或右儿子,所以必须把t[0].Max赋成-INF! 因为这个调了半天,看来回头复习复习splay是对的-- #include ...

  8. the security of smart contract- 1

    https://blog.zeppelin.solutions/the-hitchhikers-guide-to-smart-contracts-in-ethereum-848f08001f05 这个 ...

  9. Qt+QGIS二次开发:自定义类实现查询矢量数据的属性字段值(图查属性)

    在GIS领域,有两种重要的查询操作,图查属性和属性查图. 本文主要介绍如何在QGIS中通过从QgsMapToolIdentify中派生自定义类实现查询矢量数据的属性字段值(图查属性). 重点参考资料: ...

  10. Linux系统远程连接服务器命令行模式

    导读 对于很多新手来说,如何用Windows远程Linux操作系统,是个前进的大问题.如果这个问题前进不了,其他更别说了. Linux或Max OS X系统电脑,登录步骤为 1.打开ssh客户端 2. ...