前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的状态模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以Java
语言为主, 好了, 废话不多说直接开整吧~
状态模式
状态模式(State Pattern)
是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为。
在状态模式中,一个对象的状态被封装为一个对象,该状态对象则负责对象的行为变化。当对象的状态改变时,它会使用当前状态所对应的行为。
public interface State { void handle(Context context); } public class Context { private State state; public Context() { state = new ConcreteStateA(); } public void setState(State state) { this.state = state; } public void request() { state.handle(this); } } public class ConcreteStateA implements State { @Override public void handle(Context context) { System.out.println("当前状态是 A."); context.setState(new ConcreteStateB()); } } public class ConcreteStateB implements State { @Override public void handle(Context context) { System.out.println("当前状态是 B."); context.setState(new ConcreteStateA()); } } public class Client { public static void main(String[] args) { Context context = new Context(); context.request(); context.request(); context.request(); context.request(); // 当前状态是 A. // 当前状态是 B. // 当前状态是 A. // 当前状态是 B. } }
这个示例中,我们定义了一个状态接口 State
,以及两个不同状态的实现 ConcreteStateA
和 ConcreteStateB
。另外,我们还定义了一个上下文类 Context
,它用于维护对象当前的状态。当上下文对象接收到外部请求时,它会使用当前状态对象所对应的行为。
在测试代码中,我们创建了一个 Context
对象,并多次调用它的 request
方法。每次调用时,Context
对象都会使用不同状态对象的行为。在这个例子中,我们会看到输出的结果会不断地循环从状态 A
到状态 B
,再从状态 B
到状态 A
。
最佳实践
订单状态是电商平台中比较典型的状态,一般订单的状态包括下单、付款、发货、确认收货、退货等等。不同的订单状态对应着不同的行为,比如发货状态可以进行物流信息查询,确认收货状态可以对商品进行评价等等。
public interface OrderStatus { void process(Order order); } // 下单状态实现类 public class CreatedStatus implements OrderStatus { @Override public void process(Order order) { System.out.println("订单已经下单,等待付款"); order.setStatus(new PaidStatus()); } } // 付款状态实现类 public class PaidStatus implements OrderStatus { @Override public void process(Order order) { System.out.println("订单已经付款,等待发货"); order.setStatus(new ShippedStatus()); } } // 发货状态实现类 public class ShippedStatus implements OrderStatus { @Override public void process(Order order) { System.out.println("订单已经发货,等待确认收货"); order.setStatus(new DeliveredStatus()); } } // 确认收货状态实现类 public class DeliveredStatus implements OrderStatus { @Override public void process(Order order) { System.out.println("订单已经确认收货,交易完成"); order.setStatus(this); } } // 订单类 public class Order { private OrderStatus status; public Order() { status = new CreatedStatus(); } public void setStatus(OrderStatus status) { this.status = status; } public void process() { status.process(this); } } // 测试代码 public class Client { public static void main(String[] args) { Order order = new Order(); order.process(); order.process(); order.process(); order.process(); } }
输出
// 订单已经下单,等待付款 // 订单已经付款,等待发货 // 订单已经发货,等待确认收货 // 订单已经确认收货,交易完成
在这个例子中,我们定义了一个 OrderStatus
接口,以及不同实现类来表示不同的订单状态。在每个状态实现类中,我们使用了不同的输出语句来模拟不同状态对应的行为。然后,我们定义了一个 Order
类,其中包含一个 OrderStatus
成员变量来表示订单状态。在Order
类的 process
方法中,我们通过调用 OrderStatus
的 process
方法来实现订单状态的变化。在测试代码中,我们创建了一个 Order 对象,并多次调用它的 process 方法。每次调用时,它会使用不同状态对象的行为。
当我们调用 process
方法时,Order
对象会根据自己的状态自动决定使用哪个状态对象的行为,使得整个订单处理过程变得非常简单和易于维护。
结束语
设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲策略模式
~
本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注
鼓励一下呗~
相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
- 利用docker搭建es集群
- 一起来学ElasticSearch(一)
- 一起来学ElasticSearch(二)
- 一起来学ElasticSearch(三)
- 一起来学ElasticSearch(四)
- 一起来学ElasticSearch(五)
- 一起来学ElasticSearch(六)
- 一起来学ElasticSearch(七)
- 一起来学ElasticSearch(八)
- 一起来学ElasticSearch(九)
- 一起来学ElasticSearch(十)
- 一起来学ElasticSearch之整合SpringBoot(一)
- 一起来学ElasticSearch之整合SpringBoot(二)
- 一起来学ElasticSearch之整合SpringBoot(三)
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
- springboot-all
地址
: github.com/qiuChenglei…- SpringBoot系列教程合集
- 一起来学SpringCloud合集
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(二)