设计模式之状态模式
# 设计模式之状态模式
# 一、简介
在状态模式(State Pattern)中,类的行为是基于它的状态而改变的。这种类型的设计模式属于行为型模式
状态模式一般用来实现状态机,有限状态机( Finite State Machine
),缩写为 FSM
,简称为状态机。状态机有 3 个组成部分:状态(State)
、事件(Event)
、动作(Action)
。其中,事件也称为转移条件(Transition Condition)
。事件触发状态的转移及动作的执行。不过,动作不是必须的,也可能只转移状态,不执行任何动作。
# 二、实现方式
以在京东下单为例
- 三种状态State:未支付、未收货、已完成。
- 两种事件Event:支付、收货。
- 事件触发状态的转移:支付后状态为未收货,收货后状态为已完成
抽象状态类(State):状态类的接口,封装了状态及其行为
/** * 状态接口 */ public interface IPay { /** * 支付行为 * @param payStateMachine */ void pay(PayStateMachine payStateMachine); /** * 收货行为 * @param payStateMachine */ void receive(PayStateMachine payStateMachine); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15具体状态类(ConcreteState):实现了
State
@Slf4j public class UnPay implements IPay{ @Override public void pay(PayStateMachine payStateMachine) { payStateMachine.setIPay(new UnReceive()); } @Override public void receive(PayStateMachine payStateMachine) { log.info("未支付,不能收货!"); } } @Slf4j public class UnReceive implements IPay{ @Override public void pay(PayStateMachine payStateMachine) { log.info("未收到货,不能支付!"); } @Override public void receive(PayStateMachine payStateMachine) { payStateMachine.setIPay(new Final()); } } @Slf4j public class Final implements IPay{ @Override public void pay(PayStateMachine payStateMachine) { log.info("订单已完成,不能支付!"); } @Override public void receive(PayStateMachine payStateMachine) { log.info("订单已完成,不能收货!"); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39上下文对象(Context):持有
State
对象的引用,保持并切换各个状态。@Setter @Slf4j public class PayStateMachine { private IPay iPay; public PayStateMachine() { //初始化未支付 iPay = new UnPay(); } public void pay() { log.info("支付前状态{}",iPay.getClass().getSimpleName()); this.iPay.pay(this); log.info("支付后状态{}",iPay.getClass().getSimpleName()); } public void receive() { log.info("收货前状态{}",iPay.getClass().getSimpleName()); this.iPay.receive(this); log.info("收货后状态{}",iPay.getClass().getSimpleName()); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19测试
public static void main(String[] args) { PayStateMachine payStateMachine = new PayStateMachine(); payStateMachine.pay(); payStateMachine.receive(); }
1
2
3
4
5
# 三、应用场景
1、行为随状态改变而改变的场景
2、条件、分支语句的代替者