目录
State 状态模式
目录
[TOC]
1. 概述
1.1. Head First设计模式定义
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它自己的类。
状态模式将状态封装为独立的类,并将动作委托到代表当前状态的对象。
1.2. 自我理解
状态首先分为两种,”开关切换状态” 和”一般的状态判断”。
“一般的状态判断”:就是我们常用的数据状态,该场景不适合用状态模式。例如我们数据库的性别字段通常用 0=>男,1=>女,9=>其他,举例如下:
1 2 3 4 5 6 7 8 9 |
int sexStatus = 0; if(sexStatus == 0){ System.out.println("男"); }else if(sexStatus == 1){ System.out.println("女"); }else if(sexStatus == 2){ System.out.println("其他"); } |
”开关切换状态“:当我们的状态切换,并且是闭环的一种状态时,就适合用状态模式了。例如我们的车钥匙状态,LOCK->ACC, ACC->ON, ON->START, START->LOCK,形成了闭环状态的切换;
1 2 3 4 5 6 7 8 9 10 11 |
String powerStatus = "LOCK"; if("LOCK".equals(powerStatus)){ powerStatus = "ACC"; }else if("ACC".equals(powerStatus)){ powerStatus = "ON"; }else if("ON".equals(powerStatus)){ powerStatus = "START"; }else if("START".equals(powerStatus)){ powerStatus = "LOCK"; } |
1.3. 状态模式的组成
上下文 (Context):用户对象,拥有(聚合)一个 State 类型的成员,以标识对象的当前状态。
抽象状态 (State):接口或基类,封装与 Context 的特定状态相关的行为。
具体状态 (ConcreteState):接口实现类或子类,实现了一个与 Context 某个状态相关的行为。
2. UML
3. Example
3.1. 场景
随便想一个场景,汽车钥匙孔的状态,lock、acc、on、start,钥匙旋转实现对应的状态更改。
3.2. 代码实现
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
/** * Created * Date: 2021/07/13 16:08 <br/> * Description: 状态模式 * * 汽车钥匙状态 * 右转:lock -> acc -> on -> start -> lock * 左转:lock -> start -> on -> acc -> lock * * @author jomin@loserzhao.com * @see */ public class StatePatternDemo { public static void main(String[] args) { Context context = new Context(new LockState()); context.trunLeft(); context.trunLeft(); context.trunLeft(); context.trunLeft(); System.out.println("----------------------------------"); context.trunRight(); context.trunRight(); context.trunRight(); context.trunRight(); } public interface State { void trunLeft(Context context); void trunRight(Context context); void getState(); } public static class LockState implements State{ public void trunLeft(Context context) { System.out.print("lock->start\t"); context.setState(new StartState()); } public void trunRight(Context context) { System.out.print("lock->acc\t"); context.setState(new AccState()); } public void getState() { System.out.println(PowerStatusEnum.LOCK.getPowerStatusDesc()); } } public static class AccState implements State{ public void trunLeft(Context context) { System.out.print("acc->lock\t"); context.setState(new LockState()); } public void trunRight(Context context) { System.out.print("acc->on\t"); context.setState(new OnState()); } public void getState() { System.out.println(PowerStatusEnum.ACC.getPowerStatusDesc()); } } public static class OnState implements State{ public void trunLeft(Context context) { System.out.print("on->acc\t"); context.setState(new AccState()); } public void trunRight(Context context) { System.out.print("on->start\t"); context.setState(new StartState()); } public void getState() { System.out.println(PowerStatusEnum.ON.getPowerStatusDesc()); } } public static class StartState implements State{ public void trunLeft(Context context) { System.out.print("start->on\t"); context.setState(new OnState()); } public void trunRight(Context context) { System.out.print("start->lock\t"); context.setState(new LockState()); } public void getState() { System.out.println(PowerStatusEnum.START.getPowerStatusDesc()); } } public static class Context { private State state; public Context(State state){ this.state = state; } public void trunLeft(){ state.trunLeft(this); state.getState(); } public void trunRight(){ state.trunRight(this); state.getState(); } public void setState(State state) { this.state = state; } } enum PowerStatusEnum{ LOCK("lock", "只能插入或者拔出钥匙,可锁住方向盘"), ACC("acc", "允许一些电器装置工作,方向盘开锁,拔不出钥匙"), ON("on", "发动机运转并且可以使用所有电气装置的位置"), START("start", "发动机启动位置,发动机启动后松开钥匙,钥匙自动回到ON位置"); private String powerStatus; private String powerStatusDesc; PowerStatusEnum(String powerStatus, String powerStatusDesc){ this.powerStatus = powerStatus; this.powerStatusDesc = powerStatusDesc; } public String getPowerStatus() { return powerStatus; } public String getPowerStatusDesc() { return powerStatusDesc; } } |
3.3. 运行结果
1 2 3 4 5 6 7 8 9 10 11 |
lock->start 发动机启动位置,发动机启动后松开钥匙,钥匙自动回到ON位置 start->on 发动机运转并且可以使用所有电气装置的位置 on->acc 允许一些电器装置工作,方向盘开锁,拔不出钥匙 acc->lock 只能插入或者拔出钥匙,可锁住方向盘 ---------------------------------- lock->acc 允许一些电器装置工作,方向盘开锁,拔不出钥匙 acc->on 发动机运转并且可以使用所有电气装置的位置 on->start 发动机启动位置,发动机启动后松开钥匙,钥匙自动回到ON位置 start->lock 只能插入或者拔出钥匙,可锁住方向盘 |
原创文章,转载请注明: 转载自LoserZhao – 诗和远方[ http://www.loserzhao.com/ ]
本文链接地址: http://www.loserzhao.com/java/designpattern/state-designpattern.html
文章的脚注信息由WordPress的wp-posturl插件自动生成
0 条评论。