博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试必问的设计模式 | 状态模式
阅读量:4104 次
发布时间:2019-05-25

本文共 2276 字,大约阅读时间需要 7 分钟。

一、简介

状态模式 (State Pattern) 中,类的行为是基于它的状态改变的。属于 行为型模式

在状态模式中,需要创建 表示各种状态的对象 以及他们的 共同抽象接口 和一个行为随着状态对象改变而改变的 context 对象

二、实例

我们以下面一段代码使用状态模式进行重构,这是一个多重 IF 判断,当然在实际项目中,具体流程会更复杂,如果使用 if,将会产生大量的代码。

public class OrderServicePre {
public String orderState(String state) {
if (state.equals("0")) {
System.out.println("订单已支付"); } if (state.equals("1")) {
System.out.println("订单已发货"); } if (state.equals("2")) {
System.out.println("订单派送中"); } if (state.equals("3")) {
System.out.println("订单派送成功"); } if (state.equals("4")) {
System.out.println("退货"); } if (state.equals("5")) {
System.out.println("退货成功"); } return "没有订单信息"; }}

使用状态模式进行重构

首先创建订单状态抽象接口

public interface OrderStateService {
public String orderState();}

然后创建具体的实现类,表示订单的状态

public class PayService implements OrderStateService {
@Override public String orderState() {
return "订单已经支付"; }}
public class DeliveryService implements OrderStateService {
@Override public String orderState() {
return "订单派送状态"; }}

最后创建一个 Context 类,随着状态的改变,处理不同的逻辑

public class StateContext {
private OrderStateService orderStateService; public StateContext(OrderStateService orderState) {
this.orderStateService = orderState; } public String exchangeState() {
return orderStateService.orderState(); }}

测试类

public class Main {
public static void main(String[] args) {
StateContext pay = new StateContext(new PayService()); System.out.println(pay.exchangeState()); StateContext delivery = new StateContext(new DeliveryService()); System.out.println(delivery.exchangeState()); }}

三、总结

1、 策略模式状态模式 有什么区别

策略模式

根据情况采用不同策略做相同的事,返回相同结果

比如说支付,尽管有微信,支付宝,银联,但是都是支付这件事,返回的都是支付结果。

状态模式

做不同的事,返回不同的结果
比如说货物派送,不同的状态,返回不同的结果,数据

共同点

类图一样,但需求不一样

2、优缺点

优点

1、避免多重判断,解耦,降低复杂度

2、提高代码重用度,根据不同状态调用具体实现类

缺点

1、增加系统类和对象的个数

2、增加功能的时候,需要修改切换状态的代码

3、场景

1、行为随状态改变而改变的场景。

2、条件、分支语句的代替者。

4、类图

—— 完

ABOUT

公众号:【星尘Pro】

github:

推荐阅读

参考资料

https://www.runoob.com/design-pattern/state-pattern.html

https://www.runoob.com/w3cnote/state-vs-strategy.html

转载地址:http://lyfsi.baihongyu.com/

你可能感兴趣的文章
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>
k8s web终端连接工具
查看>>
手绘VS码绘(一):静态图绘制(码绘使用P5.js)
查看>>
手绘VS码绘(二):动态图绘制(码绘使用Processing)
查看>>
基于P5.js的“绘画系统”
查看>>
《达芬奇的人生密码》观后感
查看>>
论文翻译:《一个包容性设计的具体例子:聋人导向可访问性》
查看>>
基于“分形”编写的交互应用
查看>>
《融入动画技术的交互应用》主题博文推荐
查看>>
链睿和家乐福合作推出下一代零售业隐私保护技术
查看>>
Unifrax宣布新建SiFAB™生产线
查看>>
艾默生纪念谷轮™在空调和制冷领域的百年创新成就
查看>>
NEXO代币持有者获得20,428,359.89美元股息
查看>>
Piper Sandler为EverArc收购Perimeter Solutions提供咨询服务
查看>>
RMRK筹集600万美元,用于在Polkadot上建立先进的NFT系统标准
查看>>
JavaSE_day12 集合
查看>>