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. 反射的作用—>实现框架的功能

    框架与框架要解决的核心问题 我们做房子卖给用户住,用于用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中.框架与工具类有区别,工具类被用户的类调用,而框架则是 ...

  2. javascript闭包—围观大神如何解释闭包

    闭包的概念已经出来很长时间了,网上资源一大把,本着拿来主意的方法来看看. 这一篇文章 学习Javascript闭包(Closure) 是大神阮一峰的博文,作者循序渐进,讲的很透彻.下面一一剖析. 1. ...

  3. @property括号内属性讲解

    一.前言      一个object的属性允许其他object监督和改变他的状态.但是在一个设计良好的面向对象程序中,直接访问一个object的内部状态是不可能的.相反,存取器(getter sett ...

  4. vue+webpack安装sass过程中遇到权限不够,直接删除node_modus文件夹重新安装,node_modus先取得管理员权限才能删

    vue vue-style-loader !css-loader错误 最近在学习vue框架,使用webpack打包vue项目,在执行npm run start的时候 出现如下错误: This depe ...

  5. vue_模板渲染

    渲染 当获取到后端数据后,我们会把它按照一定的规则加载到写好的模板中,输出成在浏览器中显示的HTML,这个过程就称之为渲染. vue.js是在前端(即浏览器内)进行的模板渲染. 前后端渲染对比 前端渲 ...

  6. css给列表添加序号

    .middle ul{ counter-reset: show-list; } li{ padding-left: 30px; line-height: 1.3; position: relative ...

  7. (1) 天猫精灵接入Home Assistant- 网站论坛

    https://bbs.hassbian.com/forum-38-1.html 1051196347 123456 https://bbs.hassbian.com/thread-4054-1-1. ...

  8. ORB-SLAM2(2) ROS下配置和编译

    1配置USB相机 1.1网友参考: http://www.liuxiao.org/2016/07/ubuntu-orb-slam2-%E5%9C%A8-ros-%E4%B8%8A%E7%BC%96%E ...

  9. C++多线程中用临界区控制全局变量的访问冲突问题

    困扰了我很长时间的多线程访问全局变量今天终于解决了,所以得记录一下..控制全局变量的方法很多,有信号量.临界区等..这里我记录一个用临界区控制访问冲突的例子.非常好用. #include <wi ...

  10. 【Codeforces Round 1137】Codeforces #545 (Div. 1)

    Codeforces Round 1137 这场比赛做了\(A\).\(B\),排名\(376\). 主要是\(A\)题做的时间又长又交了两次\(wa4\)的. 这两次错误的提交是因为我第一开始想的求 ...