目录

  • 一、什么是状态模式
  • 二、状态模式应用场景
  • 三、状态模式实现
    • 1. 需要重构的代码
  • 四、状态模式与策略模式区别
  • 五、状态模式实现

一、什么是状态模式

状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

二、状态模式应用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
  2. 操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。 通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

三、状态模式实现

1. 需要重构的代码

public String orderState(String state) {if (state.equals("0")) {return "已经发货";}if (state.equals("1")) {return "正在运送中...调用第三方快递接口 展示 运送信息";}if (state.equals("2")) {return "正在派送中... 返回派送人员信息";}if (state.equals("3")) {return "已经签收,提示给用户快递员评价";}if (state.equals("4")) {return "拒绝签收, 重新开始申请退单";}if (state.equals("5")) {return "订单交易失败,调用短信接口提示 ";}return "未找到对应的状态";}
}

四、状态模式与策略模式区别

1、状态模式重点在各状态之间的切换从而做不同的事情,而策略模式更侧重于根据具体情况选择策略,并不涉及切换。
2、状态模式不同状态下做的事情不同,而策略模式做的都是同一件事,例如聚合支付平台,有支付宝、微信支付、银联支付,虽然策略不同,但最终做的事情都是支付,也就是说他们之间是可替换的。反观状态模式,各个状态的同一方法做的是不同的事,不能互相替换。
状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,它不能被重用;而通过从Context中分离出策略或算法,我们可以重用它们。
在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,它们只是被Context使用。

排序算法 快速排序 选择排序 冒泡排序 策略
只要是和状态相关 订单、交易、支付状态。

五、状态模式实现

maven:

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><dependencies><!-- sprinboot web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency></dependencies>

启动类:

package com.demo.order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class AppOrderService {public static void main(String[] args) {SpringApplication.run(AppOrderService.class);}
}

utils:

package com.demo.order.utils;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;@Component
public class SpringUtils implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}// 获取applicationContextpublic static ApplicationContext getApplicationContext() {return applicationContext;}// 通过name获取Beanpublic static Object getBean(String name) {return getApplicationContext().getBean(name);}// 通过class获取Beanpublic static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}// 通过name,以及Clazz返回指定的Beanpublic static <T> T getBean(String name, Class<T> clazz) {return getApplicationContext().getBean(name, clazz);}
}
package com.demo.order.service;public interface OrderState {/*** 返return*/Object orderService();
}
package com.demo.order.service.impl;import com.demo.order.service.OrderState;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class AlreadySignedOrderState implements OrderState {@Overridepublic Object orderService() {log.info(">> 切换已经签收状态..");return "切换已经签收状态";}
}
package com.demo.order.service.impl;import com.demo.order.service.OrderState;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class InTransitOrderState implements OrderState {@Overridepublic Object orderService() {log.info(">> 切换为正在运送状态..");return "切换为正在运送状态";}
}
package com.demo.order.service.impl;import com.demo.order.service.OrderState;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class ShippedAlreadyOrderState implements OrderState {@Overridepublic Object orderService() {log.info(">> 切换为已经发货状态..");return "切换为已经发货状态";}
}
package com.demo.order.context;import com.demo.order.service.OrderState;public class StateContext {private OrderState orderState;public StateContext(OrderState orderState) {this.orderState = orderState;}public void switchStateOrder() {orderState.orderService();}
}
package com.demo.order;import com.demo.order.context.StateContext;
import com.demo.order.service.impl.ShippedAlreadyOrderState;public class Test {public static void main(String[] args) {StateContext stateContext = new StateContext(new ShippedAlreadyOrderState());stateContext.switchStateOrder();}
}
package com.demo.order.controller;import com.demo.order.context.StateContext;
import com.demo.order.service.OrderState;
import com.demo.order.utils.SpringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class OrderController {@RequestMapping("/order")public String order(String stateBeanId) {// 1.使用Spring上下文获取bean对象OrderState orderState = SpringUtils.getBean(stateBeanId, OrderState.class);StateContext stateContext = new StateContext(orderState);stateContext.switchStateOrder();return "success";}
}

1.运行项目

2.分别访问:
http://127.0.0.1:8080/order?stateBeanId=alreadySignedOrderState
http://127.0.0.1:8080/order?stateBeanId=inTransitOrderState
http://127.0.0.1:8080/order?stateBeanId=shippedAlreadyOrderState

深入理解Java设计模式——状态模式相关推荐

  1. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  2. JAVA 设计模式 : 状态模式

    原文出处: 屌丝码农 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户的行为有这么几种:投入硬币.转动曲柄.退出硬币几种行为:那么糖果机呢一般有这几中状态,待机状态 ...

  3. Java设计模式——状态模式【State Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  4. Java设计模式—状态模式

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52468077冷血之心的博客) 目录 定义如下: 个人理解: 通用 ...

  5. java设计模式---状态模式

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

  6. Java设计模式-状态模式(State)

    核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线.隐身.忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1.可以通过改变状 ...

  7. java设计模式-状态模式

    状态模式介绍: 当一个对象在内在状态改变时,允许改变起行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把状态的判断逻辑转移到表示不同状态的一 ...

  8. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  9. java设计模式 建造模式_理解java设计模式之建造者模式

    理解java设计模式之建造者模式 发布于 2020-12-10| 复制链接 摘记: 建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中&qu ...

最新文章

  1. android Android build.gradle 配置注释
  2. winpcap4.1.2手动清理关键
  3. Duplicate property mapping of xxx found in xx 嵌套异常,重复的属性在映射中发现。
  4. linux命令学习之:curl
  5. python在文本添加超链接_Python将超链接文本打印到Spyder控制台(Python print hyperlinked text to Spyder Console)...
  6. jstl视图_使用JSTL视图探索Spring Controller
  7. OPPO实时数仓揭秘:从顶层设计实现离线与实时的平滑迁移
  8. 20190913:(leetcode习题)罗马数字转整数
  9. MyBatis模糊查询like的三种方式
  10. 手把手教你:安装svn出现could not write value to key的错误
  11. 使用dd命令测试裸盘性能评测
  12. 系统分析与设计 复习
  13. OpenGL中的平移旋转缩放
  14. 文件系统可视化与文件管理
  15. Quartz相关配置
  16. 《大学计算机基础》课程学习(1)——第1章 计算机基础知识
  17. 基本财务管理知识(转载)
  18. 【每天学点Python】案例三:BMR计算器
  19. 小区隔音墙生产厂家@初心不改,慢煮岁月
  20. MATLAB中BPSK的星座图及误比特率(BER)曲线仿真

热门文章

  1. 选购单反相机的新建议——心民谈宾得K5(转)
  2. 应力波通信系统实现(四)——通信信号处理技巧
  3. 基于ssm的咖啡厅管理系统
  4. 网络工程师待遇、就业前景和职业规划
  5. 中国(濮阳)埃塞咖啡加工产业示范园战略共建协议签约仪式在北京举行,标志该项目正式落地濮阳。
  6. 链表回文串判断 老酒装新壶 双指针加链表反转(代码好记易写)
  7. 17网API,item_search - 根据关键词取商品列表
  8. matlab 中乘号怎么打,MATLAB入门-基本操作
  9. docker daemon(dockerd) 配置文件 daemon.json
  10. 服务器2012系统版本,Windows Server 2012 R2版本的区别