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. Requests 校花网图片爬取

    纪念我们闹过的矛盾,只想平淡如水 import requestsimport reurl = 'http://www.xiaohuar.com/list-1-%s.html'for i in rang ...

  2. 基于python的快速傅里叶变换FFT(二)

    基于python的快速傅里叶变换FFT(二)本文在上一篇博客的基础上进一步探究正弦函数及其FFT变换. 知识点  FFT变换,其实就是快速离散傅里叶变换,傅立叶变换是数字信号处理领域一种很重要的算法. ...

  3. Django框架的使用教程--路由-请求-响应[四]

    路由 路由可以定义在工程的目录下(看你的需求),也可以定义在各个应用中来保存应用的路由,用主路文件urls中使用include()包含各个应用的子路由的数据 路由的解析顺序 Django接收到请求后, ...

  4. SAP SQVI 快速浏览器

    SQVI可向SQL一样连接多个表浏览数据. 1.输入T-CODE:SQVI. 2.新建一个新查询case 输入CASE 名.点击新建,在弹出的窗口中输入标题,在数据源中可选择单个表查询,或者选择表连接 ...

  5. January 29th, 2018 Week 05th Monday

    Losing all hope was freedom. 彻底绝望就是真正的自由. Losing all the hopes, and we are free to challenge everyth ...

  6. 【阿里八八】团队Alpha博客链接目录

    团队Alpha冲刺博客 阿里八八Alpha阶段Scrum(1/12) 阿里八八Alpha阶段Scrum(2/12) 阿里八八Alpha阶段Scrum(3/12) 阿里八八Alpha阶段Scrum(4/ ...

  7. java 三种循环及注意事项

    package debug; public class Demo8 { public static void main(String[] args) { //采用for循环打印10次Java好 for ...

  8. [题目] Luogu P3707 [SDOI2017]相关分析

    参考资料:[Luogu 3707] SDOI2017 相关分析 P3707 [SDOI2017]相关分析 TFRAC FRAC DFRAC \(\tfrac{\sum}{1}\) \(\frac{\s ...

  9. ORA-245: In RAC environment from 11.2 onwards Backup Or Snapshot controlfile needs to be in shared location (Doc ID 1472171.1)

    巡检时遇到错误如下: alert日志: Wed Dec 19 01:00:29 2018Errors in file /oracle/base/diag/rdbms/usap/usap1/trace/ ...

  10. springboot跨域配置

    前言: 当它请求的一个资源是从一个与它本身提供的第一个资源的不同的域名时,一个资源会发起一个跨域HTTP请求(Cross-site HTTP request).比如说,域名A ( http://dom ...