前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的状态模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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 专题学习
项目源码(源码已更新 欢迎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并行流有了解过吗?说说看